在 C 中调用 QML
要在 C++中调用 QML 类,需要设置 objectName 属性。
在你的 Qml 中:
import QtQuick.Controls 2.0
Button {
objectName: "buttonTest"
}
然后,在你的 C++中,你可以使用 QObject.FindChild<QObject*>(QString)
获取对象
像那样:
QQmlApplicationEngine engine;
QQmlComponent component(&engine, QUrl(QLatin1String("qrc:/main.qml")));
QObject *mainPage = component.create();
QObject* item = mainPage->findChild<QObject *>("buttonTest");
现在,你的 C++中有 QML 对象。但这似乎没用,因为我们无法真正获得对象的组件。
但是,我们可以使用它在 QML 和 C++之间发送信号。要做到这一点,你需要在你的 QML 文件中添加一个信号:signal buttonClicked(string str)
。创建后,你需要发出信号。例如:
import QtQuick 2.0
import QtQuick.Controls 2.1
Button {
id: buttonTest
objectName: "buttonTest"
signal clickedButton(string str)
onClicked: {
buttonTest.clickedButton("clicked !")
}
}
这里我们有 qml 按钮。当我们点击它时,它会转到 onClicked 方法(按下按钮时调用按钮的基本方法)。然后我们使用按钮的 id 和信号的名称来发出信号。
在我们的 cpp 中,我们需要将信号与插槽连接。像那样:
main.cpp 中
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlComponent>
#include "ButtonManager.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
QQmlComponent component(&engine, QUrl(QLatin1String("qrc:/main.qml")));
QObject *mainPage = component.create();
QObject* item = mainPage->findChild<QObject *>("buttonTest");
ButtonManager buttonManager(mainPage);
QObject::connect(item, SIGNAL(clickedButton(QString)), &buttonManager, SLOT(onButtonClicked(QString)));
return app.exec();
}
正如你所看到的,我们像以前一样使用 findChild
获取 qml 按钮,然后将信号连接到 Button 管理器,这是一个创建的类,看起来像这样。ButtonManager.h
#ifndef BUTTONMANAGER_H
#define BUTTONMANAGER_H
#include <QObject>
class ButtonManager : public QObject
{
Q_OBJECT
public:
ButtonManager(QObject* parent = nullptr);
public slots:
void onButtonClicked(QString str);
};
#endif // BUTTONMANAGER_H
ButtonManager.cpp
#include "ButtonManager.h"
#include <QDebug>
ButtonManager::ButtonManager(QObject *parent)
: QObject(parent)
{
}
void ButtonManager::onButtonClicked(QString str)
{
qDebug() << "button: " << str;
}
因此,当收到信号时,它将调用 onButtonClicked
的方法 onButtonClicked
输出: