QMLおよびC ++のQTスタディノート(オン)

QMLおよびC ++のQTスタディノート(オン)

 

目次

QMLおよびC ++のQTスタディノート(オン)

メタオブジェクトシステムへのC ++オブジェクトの登録

C ++クラスをQmlシステムに登録します

C ++はQmlオブジェクトを作成/取得します

QmlはC ++オブジェクトのパブリック関数を呼び出します

C ++オブジェクトプロパティ(オブジェクトメンバー変数)へのQmlアクセス

QmlはC ++オブジェクトスロット関数を呼び出します

メタオブジェクトシステムへのC ++オブジェクトの登録

  • Q_INVOKABLE使用して宣言します。このマクロは、メタオブジェクトシステムから呼び出し可能な関数として関数を宣言します。QtQuickもメタオブジェクトシステムに含まれているため、この機能にもアクセスできます。
class TestCpp : public QObject
{
    Q_OBJECT
public:
    explicit TestCpp(QObject *parent = nullptr);
    
    Q_INVOKABLE  void setNumber(int number);
    Q_INVOKABLE  void getNumber();
    
private:
    int m_iNumber{};    
    
signals:
    
};
  • 成し遂げる
void TestCpp::setNumber(int number)
{
    m_iNumber = number;
}

int TestCpp::getNumber()
{
    return  m_iNumber;
}
  • TestCppクラスをQMLに登録します
  • ①ヘッダーファイルを追加します(main.cppファイル内)
#include <QQmlContext>
#include "testcpp.h"
  • ②オブジェクトをインスタンス化して登録します(main.cppファイルに)
QQmlApplicationEngine engine;

//添加如下代码  
TestCpp testObj;
testObj.setNumber(12345);
engine.rootContext()->setContextProperty("testObj", &testObj);
  • ③Qmlファイル(main.qmlファイル)で使用する
import QtQuick 2.12
import QtQuick.Controls 2.5

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("QmlTest")


    Button{
        id: btn1
        width: 120
        height: 50
        anchors.centerIn: parent
        onClicked:
            text = testObj.getNumber();
    }

    Button{
        id: btn2
        width: 120
        height: 50
        anchors.top: btn1.bottom
        anchors.margins: 15
        anchors.horizontalCenter: btn1.horizontalCenter
        onClicked:
            text = testObj.setNumber(67890);
    }
}
  • 効果

C ++クラスをQmlシステムに登録します

  • qmlRegisterTypeはC ++クラスを登録します:C ++側で登録する場合、C ++クラスはインスタンス化されず、インスタンス化はQml側で行われます。
template<typename T>
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);

template<typename T, int metaObjectRevision>
int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *
  • 使用例:https://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterTypeを参照して ください
  • たとえば、このレジスタC ++クラス MySliderItem として命名QMLタイプ Slider のため、バージョン1.0型の名前空間「com.mycompany.qmlcomponents」と呼ばれます:
qmlRegisterType<MySliderItem>("com.mycompany.qmlcomponents", 1, 0, "Slider");
  • 使用する
import com.mycompany.qmlcomponents 1.0

Slider {
    // ...
}

【運動例】

  • main.qmlファイル

C ++はQmlオブジェクトを作成/取得します

  • コード
import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.Window 2.2

Window {
    width: 300
    height: 300
    color: "pink"
}
  • ②main.cpp追加
//添加头文件
#include <QQmlComponent>

//添加代码
/*const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                 &app, [url](QObject *obj, const QUrl &objUrl) {
    if (!obj && url == objUrl)
        QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);*/

QQmlComponent qmlComponent(&engine);                            
qmlComponent.loadUrl(QUrl(QStringLiteral("qrc:/TestQml.qml"))); 

QObject* qmlTest = qmlComponent.create();                       
qmlTest->setParent(engine.rootObjects()[0]);    

engine.rootContext()->setContextProperty("qmlTest", qmlTest);   
  • ③main.qml追加
ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("QmlTest")


    Button{
        id: btn1
        width: 120
        height: 50
        anchors.centerIn: parent
        onClicked: {
            qmlTest.visible = true;
            qmlTest.color  = "green"
        }
    }

    Button{
        id: btn2
        width: 120
        height: 50
        anchors.top: btn1.bottom
        anchors.margins: 15
        anchors.horizontalCenter: btn1.horizontalCenter
        onClicked:{
           qmlTest.color  = "blue"
           qmlTest.visible = true;
        }
    }
}
  • TestQml.qmlを変更し、フォーム内に長方形を追加します

  • main.cpp、findChildを介して子フォームのオブジェクトを検索します
QObject *qmlRect = qmlTest->findChild<QObject*>("rectangle");
qmlRect->setProperty("color", "pink");                       
  • 効果:

QmlはC ++オブジェクトのパブリック関数を呼び出します

  • C ++ Q_INVOKABL登録関数。

C ++オブジェクトプロパティ(オブジェクトメンバー変数)へのQmlアクセス

  • Q_PROPERTYを 使用する  
Q_PROPERTY(int number READ getNumber WRITE setNumber NOTIFY numberChanged)
  • testcpp.hで

  • コードの位置(Q_OBJECTの下の行)に注意してから、シグナルを追加します。属性の変更がトリガーされると、シグナルはnumberChangedになります。
  • main.cppに登録します
QQmlApplicationEngine engine;

//添加如下代码  
TestCpp testObj;
testObj.setNumber(12345);
engine.rootContext()->setContextProperty("testObj", &testObj);
  • main.qml add

QmlはC ++オブジェクトスロット関数を呼び出します

public slots:  
     void setNumber(int number);
void TestCpp::setNumber(int number)
{
    m_iNumber += number;
}
  • スロット関数は元々メタオブジェクトシステムにあり、C ++クラスはメタオブジェクトシステムに登録されているため、Qmlはスロット関数を直接呼び出すことができます。

おすすめ

転載: blog.csdn.net/baidu_41388533/article/details/115219122