如何使用C 插槽连接QML信号

How to connect a QML signal with a C++ slot?

本文关键字:QML 信号 连接 插槽 何使用      更新时间:2023-10-16

我在QML中有MessageDialog信号的问题。在我的MessageDialog中,我有两个按钮,是YES no 。我想用信号连接每个按钮。这是我的QML文件:

import QtQuick 2.2
import QtQuick.Dialogs 1.1
Item{
    MessageDialog {
        signal qmlYesSig(string msg)
        signal qmlNoSig (string msg)
        title: "Send data?"
        icon: StandardIcon.Question
        text: "Do you want to save your data on the online platform?"
        detailedText: "Click Yes "
        standardButtons: StandardButton.Yes | StandardButton.No
        Component.onCompleted: visible = true
        onYes: qmlYesSig("From yes")
        onNo: qmlNoSig("From no")
    }
}

这是我的插槽:

class MyClass : public QObject
{
    Q_OBJECT
public slots:
    void cppSlot(const QString &msg) {
        qDebug() << "Called the C++ slot with message:" << msg;
    }
};

这是我在主要中使用它的方式:

QQuickView view(QUrl::fromLocalFile("window.qml"));
QObject *item = view.rootObject();
AddData myClass;
QObject::connect(item, SIGNAL(qmlSignal(QString)),
                 &myClass, SLOT(cppSlot(QString)));
view.show();

它给我错误:

c2665:'qobject :: connect':3个超载都不能转换所有参数类型

我尝试过很多次,但是我无法制作工作QML信号和C 插槽。另外,我尝试了QT文档的示例,并给我同样的错误。

有人可以给我一个想法,如何连接 MessageDialog的QML信号和C 插槽?

您的QML文件是:

Item{
    MessageDialog {
        signal qmlYesSig(string msg)
        signal qmlNoSig (string msg)
        [...]
    }
}

和您的C 代码是:

QObject *item = view.rootObject();
AddData myClass;
QObject::connect(item, SIGNAL(qmlSignal(QString)),
                 &myClass, SLOT(cppSlot(QString)));

这意味着您正在寻找QML文件根项目中的称为" qmlsignal"的信号。这个根项目是

Item{}

如您所见,没有信号称为" qmlSignal"。

您必须在根项目中定义信号并从消息框发射。

Item{
    signal qmlSignal(string msg)
    MessageDialog {
        onYes: parent.qmlSignal("From yes")
        onNo: parent.qmlSignal("From no")
    }
}

您可以将C QObject暴露于QML引擎并连接到QML侧的C QObject的插槽:

在C 文件中:

view.rootContext()->setContextProperty("object", this); // replace this with appropriate object

在qml中:

qmlYesSig.connect(object.cppSlot);