我想将信号从C ++发送到QML文件中的插槽。
我已经不使用原始类型参数就可以使用它了,尽管如果我想向我的QML Slot发送QString时会在连接时出错。

我在main.cpp中连接

QObject *contentView = rootObject->findChild<QObject*>(QString("contentView"));
QObject::connect(&myObj,      SIGNAL(finishedGatheringDataForItem(QString)),
                 contentView, SLOT(updateViewWithItem(QString)));


我的qml文件的相关部分

Rectangle {
        objectName: "contentView"
        function updateViewWithItem(string) { console.log('got some Items'); }  // slot
}


错误:

Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString)

最佳答案

我认为最好查看此教程:

http://doc.qt.io/qt-4.8/qtbinding.html

特别是本节:

http://doc.qt.io/qt-4.8/qtbinding.html#receiving-signals

我认为您在这种情况下的错误可能是因为您没有将其声明为插槽,或者没有使它无法调用。这两个选项在Qt教程中都有说明。

另外,您需要使用QVariant才能在C ++和QML之间交换数据。
您还可以注册类型,例如小部件和其他东西,以便您可以在QML中将它们用作“本地”类型,例如矩形。在大多数情况下,不建议这样做,除非您需要某些特定的extern类或某些无法在QML接口中显示的数据。

使用QVariant的原因是QML基于脚本的方法。 QVariant基本上包含您的数据和该数据类型的描述,以便QML知道如何正确处理它。这就是为什么必须在QML中使用String,int等指定参数的原因。但是与C ++进行的原始数据交换仍然是QVariant

我以前使用过qmlRegisterType,但是对于简单数据类型来说,这是一个非常不方便的解决方案。相反,它用于更复杂的数据,例如QML本身不支持或扩展的QStandardItemModels的自定义Widget,Canvas或Video元素。这是在QML和C ++之间交换数据的一种更方便的方法,并且一开始不需要信号或插槽,因为QStandardItemModel会自动更新GUI。为了使用QStandardItemModel,您需要使用qmlRegisterType注册类型。然后可以在基于模型的视图(例如ListView等)中使用模型。

我为此主题附上了一个教程,它描述了如何使用QListModel。

http://doc.qt.io/qt-4.8/qdeclarativemodels.html

关于c++ - C++信号到Qt中的QML插槽,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14190397/

10-13 08:34