QML signal QT slot with QQuickView

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 中是插槽 public 插槽: 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 完成了,每个 view/file 插入到单独的选项卡中,所以现在我可以从 Main 访问所有选项卡。有一个例子:TabView

将文件插入选项卡:component: Qt.createComponent("qrc:///LoginScreen.qml")

在main.cpp中我添加: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()
        }