带有 QQuickView 的 QML 信号 QT 插槽
Posted
技术标签:
【中文标题】带有 QQuickView 的 QML 信号 QT 插槽【英文标题】:QML signal QT slot with QQuickView 【发布时间】:2015-09-24 17:41:38 【问题描述】:您好,当我使用 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");
`
【问题讨论】:
好吧,更简单的例子,我给出这个:QObject::connect(loginScreen, SIGNAL(exitApp()), &ctrl, SLOT(on_closeAppButton_clicked()));
我在 qml 文件中有 slot int ctrl 和相同的信号
哦,我明白了。比样本还不够。我们不知道那是什么类型的接收器。毫无疑问!
我有 main.qml ,其中 InitialItem 是 LoginScreen 中的 LoginScreen 我有按钮 Login 应该连接到 Qt 类中的插槽,但我不知道如何在 main.cpp 中获取连接 LoginScreen 信号与 Qt类槽。
我们在 ModelValueReceivers 中看不到,也不知道 slot 是如何定义的。
您在LoginScreen.qml
的根对象中是否真的有信号qmlSignal
,或者该信号是从某个子对象发出的?您是否看到一些调试警告?
【参考方案1】:
除非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)));
请注意,我没有测试过这段代码。
【讨论】:
那么我如何连接来自 Main.qml 中 LoginScreen 的信号 @Szymson 检查我的更新。这不能保证有效。仍然不确定这个mvr->valuesReceivers[U1]
。
在 mvr 中,我有映射 ValuesReceivers[enum],其中包含 QTcpSocket 和 slot start(QString, int)。这在我的带有 MainWindow.cpp 的 Qt 应用程序中工作。现在我需要制作 qml GUI。
你在关注这个doc.qt.io/qt-5/qtqml-cppintegration-interactqmlfromcpp.html吗?
是的,我使用此页面上的最后一个示例。当我在主页中有 qmlSignal 时它正在工作,但是当我在其他页面中有信号时它没有【参考方案2】:
好的,我已经用 TabView 完成了,每个视图/文件都插入到单独的选项卡中,所以现在我可以从 Main 访问所有选项卡。有例子:TabView
将文件插入标签:component: Qt.createComponent("qrc:///LoginScreen.qml")
在 main.cpp 我添加:QQmlContext* ctx = view.rootContext();
ctx->setContextProperty("controller", &ctrl);
在每个 qml 文件中,我可以将信号 QML 连接到 Qt Slot 并将 Qt Signal 连接到 Qml Slot:
Connections
target: controller
onSendValue:
u1TextField.text=String(value)
onClicked:
console.log("Button Clicked")
controller.on_closeAppButton_clicked()
【讨论】:
以上是关于带有 QQuickView 的 QML 信号 QT 插槽的主要内容,如果未能解决你的问题,请参考以下文章
在 Qt5.3(mingw32) 中删除 QQuickView 的内存管理问题
使用 QQuickView 或 QQuickWidget 在 QWidget 应用程序中添加大量 QML 对象会带来性能问题