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

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

问题描述:

QML中的MessageDialog信号有问题。在我的MessageDialog我有两个按钮是的没有。我想用信号连接每个按钮。 这里是我的QML文件:如何将QML信号与C++插槽连接?

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': none of the 3 overloads could convert all the argument types

我试了很多t imes,但我无法使QML信号和C++插槽工作。 另外我试着从这里的例子Qt doc并给我同样的错误。

有人可以给我一个想法如何连接QRL信号和C + +插槽为MessageDialog

+0

你在哪里定义了信号qmlSignal?不在'QObject * item = view.rootObject();' – xander

+0

这是我第一次使用来自qml的信号工作,我真的不明白我应该多做些什么。当按下按钮时,它会发出一个应该是赶上C++,写? – John

+0

尽管如此,你可以调试你的'view.rootObject()',看看你的MessageDialog是不是你定义信号的地方。因此,无论是在你的根目录中定义它,还是使用C++中的MessageDialog子对象来连接信号。 – xander

你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") 
    } 
} 
+0

谢谢你dydil。这项工作,但我有一些错误,当我使用“QObject * item = view.rootObject();”它说:“不能将'QQuickItem *'转换为'QObject *'”。你知道这是为什么吗? – John

+1

@Adi QQuickItem是一个QObject,所以问题可能是你忘了'#include '。 – dydil

+0

是的,那是:)谢谢 – John

可以公开C++的QObject到QML引擎和连接到C++的QObject从QML侧面的插槽:

在C++中的文件:

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

在设为Qml:

qmlYesSig.connect(object.cppSlot);