QMLおよびC ++のQTスタディノート(オン)
目次
メタオブジェクトシステムへの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オブジェクトを作成/取得します
- 参照できます: https : //blog.csdn.net/xiezhongyuan07/article/details/109318209
- ①TestQml.qmlという名前の新しい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はスロット関数を直接呼び出すことができます。