簡體   English   中英

帶QQuickView的QML信號QT插槽

[英]QML signal QT slot with QQuickView

您好,我在使用QQuickView時將QML信號與Qt插槽連接時遇到問題,這是我的main.cpp:

ModelValueReceivers *mvr;
mvr = new ModelValueReceivers();
QQuickView view;
view.setSource(QUrl(("qrc:///Main.qml")));
QQuickView loginScreenView;
loginScreenView.setSource(QUrl(("qrc:///LoginScreen.qml")));
QObject *loginScreen = loginScreenView.rootObject();
QObject::connect(loginScreen, SIGNAL(qmlSignal(QString, int)), mvr->valuesReceivers[U1], SLOT(start(QString, int)));
view.show()

在ModelValueReceivers中是插槽公共插槽: void start(QString ipAddress, int tcpPort);

在LoginScreen.qml中,我有信號: signal qmlSignal(string addressIP, int portTCP)

並發出onClicked

onClicked: {
            console.log("onClicked");
            qmlSignal(ipTextField.text , parseInt(tcpPortTextField.text))
        }

在控制台中,我可以看到日志“ onClicked”,但是該插槽沒有啟動。

在Main.qml中,我有:

Rectangle {
id: screen; width: 320; height: 480;
color: "#ffffff"
StackView{
    id: sv
    property StackView sv: sv 
    initialItem: Qt.resolvedUrl("qrc:///LoginScreen.qml");
} }`

我認為,除非LoginScreen.qml是單例對象,否則您將使用LoginScreen.qml 2個不同對象,一個在main.cpp ,另一個在Main.qml


更新

可能是,您可以這樣做:

Main.qml

...
signal signalFromLogin(string, int);

property Component loginScreen : LoginScreen {
   onQmlSignal: signalFromLogin(addressIP, portTCP);
}
StackView{
  id: sv
  property StackView sv: sv 
  initialItem: loginScreen;
}

現在,在您的main.cpp

QQuickView view;
view.setSource(QUrl(("qrc:///Main.qml")));
QObject* mainScreen = view.rootObject();
QObject::connect(maininScreen, SIGNAL(signalFromLogin(QString, int)), mvr->valuesReceivers[U1], SLOT(start(QString, int)));

請注意,我尚未測試此代碼。

好的,我已經使用TabView完成了此操作,並且每個視圖/文件都插入到單獨的選項卡中,因此現在我可以從Main訪問所有選項卡了。 有一個例子: TabView

將文件插入選項卡: component: Qt.createComponent("qrc:///LoginScreen.qml")

在main.cpp中,我添加: QQmlContext* ctx = view.rootContext(); ctx->setContextProperty("controller", &ctrl); QQmlContext* ctx = view.rootContext(); ctx->setContextProperty("controller", &ctrl); 在每個qml文件中,我可以將信號QML連接到Qt插槽,將Qt信號連接到Qml插槽:

Connections{
target: controller
onSendValue:{
    u1TextField.text=String(value)

    }
}



onClicked: {
            console.log("Button Clicked")
            controller.on_closeAppButton_clicked()
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM