Qt中的C++信号到QML插槽

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(也许这是唯一的连接方式).

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

    qmlVectorForm->rootContext()->setContextProperty("YourObject", myOb);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 你的信号是

    finishedGatheringDataForItem(QString signalString)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在QML文件中,添加Connectios如下:

    Connections {
        target: YourObject 
        onFinishedGatheringDataForItem: {
            qmlString = signalString
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 确定SIGNAL SLOT并不总是具有良好的性能.因此,为了优化,您应该在通过SIGNAL发送数据之前处理数据.在某些情况下,如果您在两个线程之间进行连接,请注意不要以如此高的速率发送SIGNAL,这将导致UI卡住.你应该建立一个控制发送频率的机制(可能使用定时器或延迟) (2认同)
  • @HorusKol将“连接”对象放在应该接收连接的QML组件中。通常它将是根组件。请参阅http://doc.qt.io/qt-5/qml-qtqml-connections.html中的示例 (2认同)

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

  • 在这种情况下,请尝试使用QVariant.我有几次这个问题,QML不能识别除QVariant之外的其他数据类型. (3认同)