在 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

輸出:

StackOverflow 文件