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()
}
你好,当我使用 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()
}