带有 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 的内存管理问题

如何将 Qt 鼠标事件转发到 QQuickView?

使用 QQuickView 或 QQuickWidget 在 QWidget 应用程序中添加大量 QML 对象会带来性能问题

无框 pyqt/qml 窗口

如何更改 QQuickView 的来源

如何将 qml 文件重新加载到 QQuickView