サーチ…


前書き

C ++よりはるかに簡単なので、QMLを使ってハイブリッドアプリケーションを構築することができます。だから我々は彼らがお互いにコミュニケーションする方法を知っている必要があります。

QMLでC ++を呼び出す

QMLでC ++クラスを登録する

C ++側では、 QmlCppBridgeというクラスがQmlCppBridgeprintHello()というメソッドが実装されているとします。

class QmlCppBridge : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE static void printHello() {
        qDebug() << "Hello, QML!";
    }
};

私たちはQML側でそれを使いたいと思っています。 qmlRegisterType()呼び出してクラスを登録する必要があります。

// Register C++ class as a QML module, 1 & 0 are the major and minor version of the QML module
qmlRegisterType<QmlCppBridge>("QmlCppBridge", 1, 0, "QmlCppBridge");

QMLでは、次のコードを使用して呼び出します。

import QmlCppBridge 1.0    // Import this module, so we can use it in our QML script

QmlCppBridge {
    id: bridge
}
bridge.printHello();

QQmlContextを使用してC ++クラスまたは変数をQMLに挿入する

前の例ではC ++クラスを使用しています。

QQmlApplicationEngine engine;
QQmlContext *context = engine.rootContext();

// Inject C++ class to QML
context->setContextProperty(QStringLiteral("qmlCppBridge"), new QmlCppBridge(&engine));

// Inject C++ variable to QML
QString demoStr = QStringLiteral("demo");
context->setContextProperty(QStringLiteral("demoStr"), demoStr);

QML側:

qmlCppBridge.printHello();    // Call to C++ function
str: demoStr                  // Fetch value of C++ variable

注:この例はQt 5.7に基づいています。以前のQtバージョンに適合するかどうかは不明です。

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 ++の間で信号を送ることができます。これを行うには、 signal buttonClicked(string str)ように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ように、以前のようにfindChildを使用してqmlボタンを取得し、作成したクラスとそのように見えるボタンマネージャに信号を接続します。 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メソッドが呼び出され、 "button: clicked !" onButtonClicked "button: clicked !"と書き込まれ"button: clicked !"

出力:

ここに画像の説明を入力



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow