在 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
輸出: