在 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 文档