你好我使用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");
} }`
答案 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()
}