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

时间:2017-05-03 10:59:01

标签: c++ qt

我在QML中遇到MessageDialog信号问题。在我的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")
    }
}

这是我的插槽:

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

以下是我在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();

它给我错误:

  

C2665:&#39; QObject :: connect&#39;:3个重载中没有一个可以转换所有参数类型

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

有人可以让我知道如何为MessageDialog连接QML信号和C ++插槽吗?

2 个答案:

答案 0 :(得分:6)

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

在C ++文件中:

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

在Qml中:

qmlYesSig.connect(object.cppSlot);

答案 1 :(得分:5)

您的QML文件是:

"repositories": [
    {"type": "git", "url": "https://github.com/vendor/extension.git"}
]

你的C ++代码是:

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

        [...]
    }
}

这意味着您正在QML文件的根项中查找名为“qmlSignal”的信号。 这个根项只是

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

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

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

Item{}