无法将 Qml 信号连接到 C++ 插槽

Posted

技术标签:

【中文标题】无法将 Qml 信号连接到 C++ 插槽【英文标题】:Fail To Connect Qml signal to C++ Slot 【发布时间】:2018-06-07 01:54:53 【问题描述】:

我一直在尝试在 Qml 文件和 c++ 之间连接信号,但 c++ 中的公共插槽似乎没有接收到信号。 我的程序可能有什么问题?

ma​​in.qml

Item
    id:item
    signal qml_signal
    Button
        onClicked: 
            item.qml_signal();
        
    

ma​​in.cpp

QQuickView view(QUrl("qrc:/main.qml"));
QObject *item = view.rootObject();
Myclass myclass;
QObject::connect(item, SIGNAL(qml_signal()), &myclass,SLOT(cppSlot()));

myclass.h

void cppSlot() ;

myclass.cpp

void Myclass::cppSlot()
    qDebug() << "Called the C++ slot with message:";

【问题讨论】:

可能有很多原因..取决于您的代码,请分享a Minimal, Complete, and Verifiable example 谁知道你的代码出了什么问题,因为我看不到它。也许算命先生可以帮助你,提供minimal reproducible example 【参考方案1】:

当您希望对象在 C++ 和 QML 之间进行交互时,您必须在 QML 端进行,因为从 C++ 获取 QML 对象可能会给您带来很多问题,因为在这种情况下,在 QML 中创建的信号无法处理在 C++ 中。

解决方案是将您的对象myclass 导出到 QML 并在那里建立连接:

ma​​in.cpp

#include "myclass.h"

#include <QGuiApplication>
#include <QQuickView>
#include <QQmlContext>

int main(int argc, char *argv[])

    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQuickView view(QUrl("qrc:/main.qml"));
    Myclass myclass;
    view.rootContext()->setContextProperty("myclass", &myclass);

    view.show();
    return app.exec();

ma​​in.qml

import QtQuick 2.9
import QtQuick.Controls 1.4

Item
    id:item
    signal qml_signal
    Button
        onClicked: item.qml_signal()
    
    onQml_signal: myclass.cppSlot()

【讨论】:

@eyllanesc:虽然我支持你的意见,但关于应该在哪里建立连接 - 对我来说,当你在 C++ 端建立它时它工作正常。我猜在 OP 的不完整、不可验证的示例中还有另一个错误

以上是关于无法将 Qml 信号连接到 C++ 插槽的主要内容,如果未能解决你的问题,请参考以下文章

将 QML 信号连接到 PySide2 插槽

使用 PySide2 将 python 信号连接到 QML ui 插槽

PyQt 和 QML:如何在一个插槽或函数中处理多个信号

Qt Connect 无法连接到插槽

QML 插槽中未收到 C++ 信号

Maya PySide:当我尝试将自定义信号连接到插槽时,Maya 崩溃