рд╕реА ++ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ рдХреНрдпреВрдПрдордПрд▓, рд╕рднреА рдЕрд▓рдорд╛рд░рд┐рдпреЛрдВ рдкрд░

Habr├й рдФрд░ рд╡реЗрдм рдкрд░ QML рдХреЗ рд╡рд┐рд╖рдп рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЗрдЦ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВред рдЖрдЬ рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╕реЗ рдкрд░реНрджрд╛ рдЙрдард╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬреЛ QML рдФрд░ C ++ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдереЗ, рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЕрднреА рдЗрд╕ рдЕрджреНрднреБрдд рддрдХрдиреАрдХ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
So. рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ QML рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдХрд╛рд░реНрдп рддрд░реНрдХ рдХреЗ рд╕рд╛рде C ++ рд╡рд░реНрдЧ рд╣реИред рд╣рдо рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдПрдХ рд╕рд╛рде рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ? рдЖрдЗрдП рдЕрдкрдиреЗ C ++ рд╡рд░реНрдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреВрдПрдордПрд▓ рд╕реЗ рдЗрд╕реЗ рд╕реБрд▓рдн рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ QObject рдпрд╛ рдЗрд╕ QObject рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рдВрд╢рдЬ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ред

class TestClass : public QObject { Q_OBJECT public: explicit TestClass(QObject *parent = 0); signals: public slots: }; 

рдЕрдм рд╣рдо QML рд╕реЗ рдХреБрдЫ рд╕рдВрдкрддреНрддрд┐ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдпреЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ Q_PROPERTY рдореИрдХреНрд░реЛ рд╣реИред
 class TestClass : public QObject { Q_OBJECT Q_PROPERTY(int someProperty READ getSomeProperty WRITE setSomeProperty NOTIFY somePropertyChanged) public: explicit TestClass(QObject *parent = 0); int getSomeProperty()const; void setSomeProperty(const int &); private: int someProperty; signals: void somePropertyChanged(); public slots: }; int TestClass::getSomeProperty()const { qDebug() << "I'm getter"; return someProperty; } void TestClass::setSomeProperty(const int &i) { qDebug() << "I'm setter"; someProperty = i; } 


рдпрд╣рд╛рдБ рдХреБрдЫProperty рд╣рдорд╛рд░реА рд╕рдВрдкрддреНрддрд┐ рд╣реИ, getSomeProperty рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ, setSomeProperty рд▓рд┐рдЦрдиреЗ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред рдпрджрд┐ рд╣рдо C ++ рд╕реЗ рдЕрдкрдиреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ QML рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП somePropertybhangedред рдЕрдм рд╣рдореЗрдВ QML рдореЗрдВ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ QmlApplicationViewer рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ QtCreator рдПрдХ рдирдпрд╛ QtQuick рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╕рдордп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ, рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди qmlRegealTypes рдореЗрдВ рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВред

 qmlRegisterType<TestClass>("ModuleName", 1, 0, "TypeName"); 


рдпрд╣рд╛рдБ TestClass рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рд╣реИ, ModuleName рдЖрдпрд╛рддрд┐рдд QML рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рд╣реИ, TypeName QML рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо рд╣реИред рдЕрдм рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ рдХреНрдпреВрдПрдордПрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВред
 import QtQuick 1.0 import ModuleName 1.0 Rectangle { width: 360 height: 360 TypeName{ id: myObj someProperty: 10 } Text { text: "My property is: " + myObj.someProperty anchors.centerIn: parent } MouseArea { anchors.fill: parent onClicked: { Qt.quit(); } } } 


рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рддреЛрдВ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
1)
 import ModuleName 1.0 
- рдЗрд╕рд▓рд┐рдП рд╣рдо QML рдЗрдВрдЬрди рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗред
2)
 TypeName{ id: myObj someProperty: 10 } 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдирд╛ рдФрд░ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд▓рд┐рдЦрдирд╛ред
3)
 text: "My property is: " + myObj.someProperty 
- рд╣рдорд╛рд░реА рд╕рдВрдкрддреНрддрд┐ рдкрдврд╝рдирд╛ред

рд╕рдВрдХрд▓рди рдХрд░реЗрдВ, рдЪрд▓рд╛рдПрдВред
рдЫрд╡рд┐

QML C ++ рд╕реЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рд╕реНрд▓реЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╛ Q_INVOKABLE рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

 class TestClass : public QObject { Q_OBJECT Q_PROPERTY(int someProperty READ getSomeProperty WRITE setSomeProperty NOTIFY somePropertyChanged) public: explicit TestClass(QObject *parent = 0); int getSomeProperty()const; void setSomeProperty(const int &); Q_INVOKABLE void myMethod(); private: int someProperty; signals: void somePropertyChanged(); public slots: void mySlot(); }; void TestClass::myMethod() { qDebug() << "I am Method"; someProperty++; } void TestClass::mySlot() { qDebug() << "I am SLOT"; someProperty--; } 


QML рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВред
 import QtQuick 1.0 import ModuleName 1.0 Rectangle { width: 360 height: 360 TypeName{ id: myObj someProperty: 10 } Text { text: "My property is: " + myObj.someProperty anchors.centerIn: parent } Rectangle{ width: 20 height: 20 color: "red" MouseArea { anchors.fill: parent onClicked: { myObj.mySlot(); } } } Rectangle{ anchors.right: parent.right width: 20 height: 20 color: "blue" MouseArea { anchors.fill: parent onClicked: { myObj.myMethod(); } } } } 


рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЪреМрдХреЛрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдбрд┐рдмрдЧ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд╣рдорд╛рд░реА рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ foresaw рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп, рд╣рдордиреЗ NOTIFY рдХреЛ рдХреБрдЫPropertyChanged рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛, рд╣рдо рдЕрдкрдиреА рд╡рд┐рдзрд┐ рдФрд░ рд╕реНрд▓реЙрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреБрдЫPropertyChanged рд╕рд┐рдЧреНрдирд▓ рдХреЛ рддрдм рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
 void TestClass::myMethod() { qDebug() << "I am Method"; someProperty++; emit somePropertyChanged(); } void TestClass::mySlot() { qDebug() << "I am SLOT"; someProperty--; emit somePropertyChanged(); } 


рд╕рдВрдХрд▓рди рдХрд░реЗрдВ, рдЪрд▓рд╛рдПрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдЖрдирдВрдж рд▓реЗрдВ - рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рд╕реНрд╡рдпрдВ QML рдХреЛрдб рд╕реЗ C ++ рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рд╕рд┐рдЧреНрдирд▓ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдЙрд╕ рд╕рдордп рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ рдЬрдм рд╣рдо рдХреГрдкрдпрд╛ред
 void TestClass::mySlot() { qDebug() << "I am SLOT"; someProperty--; emit somePropertyChanged(); if(someProperty < 0) emit someSignal(); } 


рдХреНрдпреВрдПрдордПрд▓ рдореЗрдВ рдЗрд╕ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдХреЛ рдПрдХ рдСрдирд╕рд┐рдЧреНрдирд▓ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреВрдПрдордПрд▓ рдореЗрдВ рдИрд╡реЗрдВрдЯ рдирд╛рдо рдКрдкрд░реА рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдкрд╣рд▓реЗ рдЕрдХреНрд╖рд░ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рдФрд░ рдЙрдкрд╕рд░реНрдЧ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 TypeName{ id: myObj someProperty: 10 onSomeSignal: { Qt.quit(); } } 


рдпрд╣ рдХреИрд╕реЗ рдПрдХ рдХреНрдпреВрдПрдордПрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рдм рдореИрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In140899/


All Articles