繁体   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