QML信号QT插槽与QQuickView

时间:2015-09-24 17:41:39

标签: c++ qt signals qml slot

你好我使用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)

和emit是onClicked

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

在控制台中我可以看到log" 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");
} }`

2 个答案:

答案 0 :(得分:1)

除非LoginScreen.qml是单身人士,否则我认为您使用LoginScreen.qml的两个不同对象,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)));

请注意,我还没有测试过此代码。

答案 1 :(得分:0)

好的我已经使用TabView完成了它,并且每个视图/文件都插入到单独的选项卡中,所以现在我可以访问Main的所有选项卡。有一个例子:TabView

将文件插入标签:component: Qt.createComponent("qrc:///LoginScreen.qml")

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

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

    }
}



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