首页 文章

C信号到Qt中的QML插槽

提问于
浏览
43

我想在CML文件中将信号从C发送到插槽 . 我已经让它在没有和原始类型参数的情况下工作,但是如果我想将 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)

2 回答

  • 30

    我认为最好检查本教程:

    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中将它们用作像“矩形”这样的“本机”类型 . 在大多数情况下,建议不要这样做,除非您需要某些外部类或某些数据,否则您无法在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

  • 29

    在这种情况下你应该使用 Connections (也许这是唯一的连接方式) .

    • 通过``setContextProperty将对象 myObj 放到QML文件中
    qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
    
    • 你的信号是
    finishedGatheringDataForItem(QString signalString)
    
    • 在QML文件中,添加Connectios,如下所示:
    Connections {
        target: YourObject 
        onFinishedGatheringDataForItem: {
            qmlString = signalString
        }
    }
    

相关问题