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。

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

在这种情况下,你应该使用连接 (也许这是连接的唯一方法)。

  1. 通过setContextProperty将你的对象myObj放到QML文件中

     qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb); 
  2. 你的信号是

     finishedGatheringDataForItem(QString signalString) 
  3. 在QML文件中,添加Connectios如下所示:

     Connections { target: YourObject onFinishedGatheringDataForItem: { qmlString = signalString } }