如何将QML信号与C ++插槽连接?

Adr*_*ian 4 c++ qt

MessageDialog在QML中遇到信号问题。在我的MessageDialog我有两个按钮。我想用信号连接每个按钮。这是我的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")
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的广告位:

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

这是我在main中使用此方法的方式:

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

view.show();
Run Code Online (Sandbox Code Playgroud)

它给我错误:

C2665:'QObject :: connect':3个重载都不能转换所有参数类型

我已经尝试了很多次,但是无法使用QML信号和C ++插槽。我也尝试从这里Qt doc的示例,并给我同样的错误。

有人可以告诉我如何连接QML信号和C ++插槽MessageDialog吗?

e.j*_*dar 7

您可以将C ++ QObject暴露给QML引擎,并从QML端连接到C ++ QObject的插槽:

在C ++文件中:

view.rootContext()->setContextProperty("object", this); // replace this with appropriate object
Run Code Online (Sandbox Code Playgroud)

在Qml中:

qmlYesSig.connect(object.cppSlot);
Run Code Online (Sandbox Code Playgroud)

  • 如果有更完整的例子,我们将不胜感激。例如,您将连接代码放在 QML 中的哪个位置?如何将连接类型设置为排队连接? (2认同)

小智 5

您的QML文件是:

Item{
    MessageDialog {
        signal qmlYesSig(string msg)
        signal qmlNoSig (string msg)

        [...]
    }
}
Run Code Online (Sandbox Code Playgroud)

您的C ++代码是:

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

这意味着您正在QML文件的根项目中寻找一个名为“ qmlSignal”的信号。这个根项目很简单

Item{}
Run Code Online (Sandbox Code Playgroud)

如您所见,没有称为“ qmlSignal”的信号。

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

Item{
    signal qmlSignal(string msg)

    MessageDialog {
        onYes: parent.qmlSignal("From yes")
        onNo: parent.qmlSignal("From no")
    }
}
Run Code Online (Sandbox Code Playgroud)