[英]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.