【发布时间】:2017-05-03 10:59:01
【问题描述】:
我对 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;
}
};
这是我在 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: 'QObject::connect': 3 个重载都不能转换所有参数类型
我尝试了很多次,但我无法使 QML 信号和 C++ 插槽工作。 我也尝试了这里的示例Qt doc 并给了我同样的错误。
谁能告诉我如何为MessageDialog 连接 QML 信号和 C++ 插槽?
【问题讨论】:
-
你在哪里定义了信号
qmlSignal?不在QObject *item = view.rootObject(); -
这是我第一次使用来自 qml 的信号。我真的不明白我应该做些什么。当按下按钮时,它会发出一个应该在 C++ 中捕获的信号,写吗?
-
仍然,您可以调试您的
view.rootObject()并查看不是您定义信号的 MessageDialog。所以要么在你的根Item中定义它,要么在 C++ 中获取MessageDialog子对象来连接信号。 -
我刚查了Qt Doc,我猜你可以使用
view.rootObject()->childItems().first()(应该是你的MessageDialog) -
应该
qmlSignal是qmlYesSig?