如何将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
?
答
你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引擎和连接到C++的QObject从QML侧面的插槽:
在C++中的文件:
view.rootContext()->setContextProperty("object", this); // replace this with appropriate object
在设为Qml:
qmlYesSig.connect(object.cppSlot);
你在哪里定义了信号qmlSignal?不在'QObject * item = view.rootObject();' – xander
这是我第一次使用来自qml的信号工作,我真的不明白我应该多做些什么。当按下按钮时,它会发出一个应该是赶上C++,写? – John
尽管如此,你可以调试你的'view.rootObject()',看看你的MessageDialog是不是你定义信号的地方。因此,无论是在你的根目录中定义它,还是使用C++中的MessageDialog子对象来连接信号。 – xander