수색…


소개

하이브리드 응용 프로그램을 빌드하는 데 QML을 사용할 수 있습니다. C ++보다 훨씬 쉽기 때문입니다. 그래서 우리는 서로 의사 소통하는 방법을 알아야합니다.

QML에서 C ++ 호출하기

QML에 C ++ 클래스 등록

C ++ 측에서는 QmlCppBridge 라는 클래스가 있다고 가정하고 printHello() 라는 메서드를 구현합니다.

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 ++간에 신호 를 보내는 데 사용할 수 있습니다. 이를 위해 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 버튼을 findChild 우리는 생성 된 클래스이고 그와 비슷한 모습의 버튼 관리자에 신호를 연결합니다. 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