प्रौद्योगिकी साझेदारी

[qml study notes] QML तथा C इत्येतयोः मध्ये अन्तरक्रिया

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

QML तथा C++ इत्येतयोः मध्ये अन्तरक्रिया

QML मध्ये c++ ऑब्जेक्ट्स् अभिगच्छन्तु
  • प्रथमं क्लास् रचयन्तुQ_OBJECTmacro, and join इतिQML_ELEMENTमैक्रो, निजीसदस्यानां च अस्तिQ_PROPERTYमैक्रो (माध्यमेन उपलब्धम्ALT+ENTERत्वरित सेटअप) २.
#include <QObject>
#include <QtQml>//注意 QML_ELEMENT 需要该头文件
class MyCppObj : public QObject
{
    Q_OBJECT
    QML_ELEMENT
public:
    explicit MyCppObj(QObject *parent = nullptr);
    int iValue() const;
    void setIValue(int newIValue);
    
    QString string() const;
    void setString(const QString &newString);
    //加入 Q_INVOKABLE宏的函数才可在QML端进行访问
    Q_INVOKABLE void func();
    
private:
    int m_iValue;
    QString m_string;
    
    Q_PROPERTY(int iValue READ iValue WRITE setIValue NOTIFY iValueChanged FINAL)
    Q_PROPERTY(QString string READ string WRITE setString NOTIFY stringChanged FINAL)
    
signals:
    void iValueChanged();
    void stringChanged();
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • cpp सञ्चिकायां वस्तु पञ्जीकरणं कुर्वन्तु
//一定要通过创建对象来定义我们自定义的obj,对象存在于qml端
qmlRegisterType<MyCppObj>("MyCppObj.Obj",1,0,"MyCppObj");
//MyCppObj.Obj:import的库的名字
//1:主版本号
//0:次版本号
//MyCppObj:QML中类的名字
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • qml सञ्चिकायां आयात्य तस्य उपयोगं कुर्वन्तु
import QtQuick 2.15
import QtQuick.Window 2.15
import MyCppObj 1.0
Window {
    width: 640
    height: 480
    visible: true
    MyCppObj
    {
        id:myObj
        onIValueChanged: {}
        onSstringChanged: {}
    }
    Component.onCompleted:
    {
        console.log(myObj.iValue,myObj.sstring)
        myObj.func()
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
QML पक्षसंकेताः C++ पक्षे (qml पक्षे सम्बद्धाः) बद्धाः भवन्ति ।

उपर्युक्तसामग्रीणाम् आधारेण, c++ वर्गस्य पञ्जीकरणं सम्पन्नं कृत्वा

  • स्लॉट् फंक्शन् घोषयन्तु : १.
public slots:
    void cppSlot(int i,QString s)
    {
    qDebug()<<__FUNCTION__<<i<<s;
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • QML मध्ये संयोजनम्
Window {
    id:window
    width: 640
    height: 480
    visible: true
    signal qmlSignal(int i,string s)
    MyCppObj
    {
        id:myObj
        onIValueChanged: {}
        onSstringChanged: {}
    }

    Button{
        onClicked:
        {
            qmlSignal(10,"666")
        }
    }
    Connections
    {
        target: window
        function onQmlSignal(i,s)
        {
            myObj.cppSlot(i,s);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • अन्यः संयोगविधिः
Component.onCompleted:
    {
        qmlSignal.connect(myObj.cppSlot)
    }
  • 1
  • 2
  • 3
  • 4
C++ पक्षे संयोजनम्
engine.load(url);
auto list = engine.rootObjects();//在engine.load之后
auto window = list.first();
MyCppObj *myObj = new MyCppObj();
    QObject::connect(window,SIGNAL(qmlSignal(int,QString)),myObj,SLOT(cppSlot(int,QString)));
  • 1
  • 2
  • 3
  • 4
  • 5
QML पक्षे बद्धाः C++ पक्षसंकेताः
  • qml पक्षे बन्धनम्
 Button{
        onClicked:
        {
            myObj.cppSignal(10,"6")
        }
    }
    function qmlSlot(i,s)
    {
        console.log("qml",i,s)
    }
    Connections
    {
        target: myObj
        function onCppSignal(i,s)
        {
            qmlSlot(i,s);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • c++ पक्षे संयोजयन्

ध्यानं कुर्वन्तु यत् प्रेषक-ग्राहक-पक्षयोः पैरामीटर् QVariant प्रकारस्य भवितुमर्हति ।

QObject::connect(myObj,SIGNAL(cppSignal(QVariant,QVariant)),window,SLOT(qmlSlot(QVariant,QVariant)));
  • 1
एकल वर्गं पञ्जीकरणं कुर्वन्तु

यदा वयं प्रयुञ्ज्महेqmlRegisterTypeयदा, अस्माकं कस्टम् obj इत्येतत् ऑब्जेक्ट् रचयित्वा परिभाषितुं आवश्यकं भवति The object qml पक्षे विद्यते तथा च यदा अस्माकं क्लास् इत्यस्य ग्लोबलरूपेण अस्तित्वस्य आवश्यकता भवति तदा तस्य उपयोगः कर्तुं शक्यते ।qmlRegisterSingletonInstance

 MyCppObj *myObj = new MyCppObj();
    qmlRegisterSingletonInstance("MyCppObjSingle",1,0,"MyCppObj",myObj);
  • 1
  • 2
C++ पक्षः QML पार्श्वकार्यं आह्वयति
  • qml वस्तु प्राप्त करें
auto list = engine.rootObjects();
    auto window = list.first();
  • 1
  • 2
  • रिटर्न् वैल्यूस् तथा पैरामीटर्स् सज्जीकरोतु
 QVariant res;
 QVariant arg_1 = 123;
 QVariant arg_2 = "ffffff";
  • 1
  • 2
  • 3
  • QMetaObject::invokeMethod इत्यस्य माध्यमेन आह्वानं कृतम्
QMetaObject::invokeMethod(window,//获取到的qml对象
						 "qmlFunc",//需要调用的函数名
						  Q_RETURN_ARG(QVariant,res),//准备好的返回值和参数
						  Q_ARG(QVariant,arg_1),
						  Q_ARG(QVariant,arg_2));
  • 1
  • 2
  • 3
  • 4
  • 5