ale*_*lex 51 c++ qt signals-slots qml
我想从C++向我的QML文件中的Slot发送一个Signal.我已经让它没有和原始类型参数工作,但如果我想发送QString到我的QML插槽我连接时出错.
我在main.cpp中连接
QObject *contentView = rootObject->findChild<QObject*>(QString("contentView"));
QObject::connect(&myObj, SIGNAL(finishedGatheringDataForItem(QString)),
contentView, SLOT(updateViewWithItem(QString)));
Run Code Online (Sandbox Code Playgroud)
我的qml文件的相关部分
Rectangle {
objectName: "contentView"
function updateViewWithItem(string) { console.log('got some Items'); } // slot
}
Run Code Online (Sandbox Code Playgroud)
错误:
Object::connect: No such slot QDeclarativeRectangle_QML_2::updateViewWithItem(QString)
Run Code Online (Sandbox Code Playgroud)
Ken*_*Ken 36
在这种情况下你应该使用Connections(也许这是唯一的连接方式).
将你的对象myObj放到QML文件中setContextProperty
qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
Run Code Online (Sandbox Code Playgroud)你的信号是
finishedGatheringDataForItem(QString signalString)
Run Code Online (Sandbox Code Playgroud)在QML文件中,添加Connectios如下:
Connections {
target: YourObject
onFinishedGatheringDataForItem: {
qmlString = signalString
}
}
Run Code Online (Sandbox Code Playgroud)mmo*_*ent 35
我认为最好检查本教程:
http://doc.qt.io/qt-4.8/qtbinding.html
特别是这部分:
http://doc.qt.io/qt-4.8/qtbinding.html#receiving-signals
我认为你在这种情况下的错误可能是你没有将它声明为一个插槽或者你没有让它成为可调用的.这两个选项都在Qt教程中进行了解释.
此外,您需要使用QVariant才能在C++和QML之间交换数据.您还可以注册类型,例如Widgets和stuff,以便您可以在QML中将它们用作像"矩形"这样的"本机"类型.在大多数情况下,建议不要这样做,除非您需要某些外部类或某些数据,否则您无法在QML界面中显示.
QVariant的原因是基于脚本的QML方法.QVariant基本上包含您的数据和数据类型的描述,以便QML知道如何正确处理它.这就是为什么你必须使用String,int等在QML中指定参数.但是与C++的原始数据交换仍然是QVariant
我以前使用过qmlRegisterType,但对于简单数据类型来说这是一个非常不方便的解决方案.它更适用于更复杂的数据,例如QML本身不支持或扩展的自定义窗口小部件,画布或视频元素QStandardItemModels.这是在QML和C++之间交换数据的更方便的方法,并且在第一个实例中不需要信号或插槽,因为QStandardItemModel自动更新GUI.要使用QStandardItemModel,您需要使用qmlRegisterType注册Type .. 然后可以在基于模型的视图中使用模型,例如ListView等.
我附上了这个主题的教程,它描述了如何使用QListModel.
http://doc.qt.io/qt-4.8/qdeclarativemodels.html
| 归档时间: |
|
| 查看次数: |
69520 次 |
| 最近记录: |