Qt中的C ++ SIGNAL到QML SLOT
我想发送一个信号从C ++到我的QML文件中的一个槽。 我已经得到它没有和原始types参数工作,但如果我想发送一个QString
到我的QML插槽,我会在连接时出错。
我在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之间交换数据。 您还可以注册types,例如小部件和东西,以便您可以在QML中将它们用作“原生”types,如矩形。 在大多数情况下,这是不推荐的,除非你需要一些特定的extern类或一些你不能在你的QML界面中显示的数据。
QVariant的原因是QML的基于脚本的方法。 QVariant基本上包含您的数据和数据types的描述,以便QML知道如何正确处理它。 这就是为什么你必须使用String,int等在QML中指定参数。但是与C ++的原始数据交换仍然是一个QVariant
我之前使用过qmlRegisterType,但是对于简单的数据types来说这是一个非常不方便的解决scheme。 它相当用于更复杂的数据,例如QML本身不支持或扩展QStandardItemModels
自定义Widgets,Canvas或Video元素。 在QML和C ++之间交换数据是一种更方便的方式,因为QStandardItemModel自动更新GUI,因此不需要第一个实例中的信号或插槽。 对于使用QStandardItemModel,你需要注册typesqmlRegisterType ..。 该模型可以用于基于模型的视图,如ListView等
我附上了这个主题的教程,它描述了如何使用QListModel。
在这种情况下,你应该使用连接 (也许这是连接的唯一方法)。
-
通过setContextProperty将你的对象myObj放到QML文件中
qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
-
你的信号是
finishedGatheringDataForItem(QString signalString)
-
在QML文件中,添加Connectios如下所示:
Connections { target: YourObject onFinishedGatheringDataForItem: { qmlString = signalString } }