无法将 Qml 信号连接到 C++ 插槽
Posted
技术标签:
【中文标题】无法将 Qml 信号连接到 C++ 插槽【英文标题】:Fail To Connect Qml signal to C++ Slot 【发布时间】:2018-06-07 01:54:53 【问题描述】:我一直在尝试在 Qml 文件和 c++ 之间连接信号,但 c++ 中的公共插槽似乎没有接收到信号。 我的程序可能有什么问题?
main.qml
Item
id:item
signal qml_signal
Button
onClicked:
item.qml_signal();
main.cpp
QQuickView view(QUrl("qrc:/main.qml"));
QObject *item = view.rootObject();
Myclass myclass;
QObject::connect(item, SIGNAL(qml_signal()), &myclass,SLOT(cppSlot()));
myclass.h
void cppSlot() ;
myclass.cpp
void Myclass::cppSlot()
qDebug() << "Called the C++ slot with message:";
【问题讨论】:
可能有很多原因..取决于您的代码,请分享a Minimal, Complete, and Verifiable example 谁知道你的代码出了什么问题,因为我看不到它。也许算命先生可以帮助你,提供minimal reproducible example 【参考方案1】:当您希望对象在 C++ 和 QML 之间进行交互时,您必须在 QML 端进行,因为从 C++ 获取 QML 对象可能会给您带来很多问题,因为在这种情况下,在 QML 中创建的信号无法处理在 C++ 中。
解决方案是将您的对象myclass
导出到 QML 并在那里建立连接:
main.cpp
#include "myclass.h"
#include <QGuiApplication>
#include <QQuickView>
#include <QQmlContext>
int main(int argc, char *argv[])
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQuickView view(QUrl("qrc:/main.qml"));
Myclass myclass;
view.rootContext()->setContextProperty("myclass", &myclass);
view.show();
return app.exec();
main.qml
import QtQuick 2.9
import QtQuick.Controls 1.4
Item
id:item
signal qml_signal
Button
onClicked: item.qml_signal()
onQml_signal: myclass.cppSlot()
【讨论】:
@eyllanesc:虽然我支持你的意见,但关于应该在哪里建立连接 - 对我来说,当你在 C++ 端建立它时它工作正常。我猜在 OP 的不完整、不可验证的示例中还有另一个错误以上是关于无法将 Qml 信号连接到 C++ 插槽的主要内容,如果未能解决你的问题,请参考以下文章