无法将 Qml 信号连接到C++插槽

Fail To Connect Qml signal to C++ Slot

本文关键字:C++ 插槽 连接 信号 Qml      更新时间:2023-10-16

>我一直在尝试连接Qml文件和c ++之间的信号,但是c ++中的公共插槽似乎没有收到信号。 我的程序可能有什么问题?

主.qml

Item{
id:item
signal qml_signal
Button{
onClicked: {
item.qml_signal();
}
}
}

主.cpp

QQuickView view(QUrl("qrc:/main.qml"));
QObject *item = view.rootObject();
Myclass myclass;
QObject::connect(item, SIGNAL(qml_signal()), &myclass,SLOT(cppSlot()));

我的班级

void cppSlot() ;

我的班级.cpp

void Myclass::cppSlot(){
qDebug() << "Called the C++ slot with message:";
}

当你希望对象在C++和 QML 之间进行交互时,你必须在 QML 端进行交互,因为从C++获取 QML 对象会给你带来很多问题,因为在这种情况下,在 QML 中创建的信号无法在C++中处理。

解决方案是将对象myclass导出到 QML 并在那里建立连接:

主.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();
}

主.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()
}