Qt
QML और C ++ के बीच संचार
खोज…
परिचय
हाइब्रिड अनुप्रयोगों के निर्माण के लिए हम 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 ++ वर्गों या चर को इंजेक्ट करने के लिए QQmlContext का उपयोग करना
हम अभी भी पिछले उदाहरण में 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 क्लासेस को कॉल करने के लिए, आपको ऑब्जेक्टनेम प्रॉपर्टी सेट करने की आवश्यकता है।
अपने Qml में:
import QtQuick.Controls 2.0
Button {
objectName: "buttonTest"
}
फिर, अपने C ++ में, आप QObject.FindChild<QObject*>(QString)
साथ ऑब्जेक्ट प्राप्त कर सकते हैं। 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 बटन है। जब हम उस पर क्लिक करते हैं, तो वह ऑनक्लीक विधि (बटन के लिए एक आधार विधि जिसे आप बटन दबाते हैं, कहा जाता है) पर जाता है। फिर हम सिग्नल से बाहर निकलने के लिए बटन की आईडी और सिग्नल के नाम का उपयोग करते हैं।
और हमारे 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
साथ हमारे qml बटन प्राप्त करते हैं और हम एक बटन प्रबंधक को संकेत कनेक्ट करते हैं जो एक वर्ग बनाया गया है और जो इस तरह दिखता है। 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 !"
होगा "button: clicked !"
उत्पादन: