我想将信号从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/