无法将Qml信号连接到C ++插槽

时间:2018-06-07 01:54:54

标签: c++ qt qml qt5

我一直在尝试在Qml文件和c ++之间连接信号,但c ++中的公共插槽似乎没有收到信号。 我的计划可能出现什么问题?

main.qml

Item{
    id:item
    signal qml_signal
    Button{
        onClicked: {
            item.qml_signal();
        }
    }
}

的main.cpp

QQuickView view(QUrl("qrc:/main.qml"));
QObject *item = view.rootObject();
Myclass myclass;
QObject::connect(item, SIGNAL(qml_signal()), &myclass,SLOT(cppSlot()));

myclass.h

void cppSlot() ;

myclass.cpp

void Myclass::cppSlot(){
    qDebug() << "Called the C++ slot with message:";
}

1 个答案:

答案 0 :(得分:1)

当您希望对象在C ++和QML之间进行交互时,您必须在QML端进行,因为从C ++获取QML对象会导致许多问题,因为在这种情况下,无法处理在QML中创建的信号在C ++中。

&#xA;&#xA;

解决方案是将对象 myclass 导出到QML并在那里建立连接:

&#xA;& #xA;

main.cpp

&#xA;&#xA;
  #include“myclass.h”&#xA;&#xA;#包括&lt; QGuiApplication&gt;&#xA; #include&lt; QQuickView&gt;&#xA; #include&lt; QQmlContext&gt;&#xA;&#xA; int main(int argc,char * argv [])&#xA; { &#XA; QCoreApplication ::的setAttribute(Qt的:: AA_EnableHighDpiScaling);&#XA;&#XA; QGuiApplication app(argc,argv);&#xA;&#xA; QQuickView视图(QUrl(“qrc:/main.qml”));&#xA; Myclass myclass;&#xA; view.rootContext() - &gt; setContextProperty(“myclass”,&amp; myclass);&#xA;&#xA; view.show();&#XA;返回app.exec();&#xA;}&#xA;  
&#xA;&#xA;

main.qml

& #xA;&#xA;
  import QtQuick 2.9&#xA; import QtQuick.Controls 1.4&#xA;&#xA; Item {&#xA; ID:项目&#XA;信号qml_signal&#xA;按钮{&#XA; onClicked:item.qml_signal()&#xA; }&#XA; onQml_signal:myclass.cppSlot()&#xA;}&#xA;  
&#xA;