QQmlApplicationEngine का उपयोग करते समय मैं अपने विंडो ऑब्जेक्ट गुणों को C++ से कैसे एक्सेस कर सकता हूं?



qt user-interface (1)

मेरी टिप्पणी को उचित उत्तर में बदलना: यह आमतौर पर दो तरीकों से किया जाता है:

  • यदि आप QQuickView या केवल QQuickView उपयोग करते हैं तो अपने क्यूएमएल दृश्य की मूल वस्तु को एक दृश्य के माध्यम से QQmlApplicationEngine करें।

  • यह अगला चरण रूट ऑब्जेक्ट्स के लिए छोड़ा जा सकता है, लेकिन सामान्य रूप से "qml ऑब्जेक्ट्स" के लिए, आपको ऑब्जेक्टनाम संपत्ति सेट करने की आवश्यकता होगी और फिर आप निम्न विधियों वाले किसी भी बच्चे को ढूंढ सकते हैं:

QList QObject :: findChildren (कॉन्स क्यूस्ट्रिंग और नाम = क्यूस्ट्रिंग (), क्यूटी :: FindChildOptions विकल्प = क्यूटी :: FindChildrenRecursively) const

सी ++ पक्ष

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QDebug>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    // Step 1: get access to the root object
    QObject *rootObject = engine.rootObjects().first();
    QObject *qmlObject = rootObject->findChild<QObject*>("mainWindow");

    // Step 2a: set or get the desired property value for the root object
    rootObject->setProperty("visible", true);
    qDebug() << rootObject->property("visible");

    // Step 2b: set or get the desired property value for any qml object
    qmlObject->setProperty("visible", true);
    qDebug() << qmlObject->property("visible");

    return app.exec();
}

संपत्ति सेट के लिए प्रलेखन देखें और आधिकारिक दस्तावेज में प्राप्त करें:

बूल QObject :: setProperty (कॉन्स चार * नाम, कॉन्स QVariant और मूल्य)

तथा

QVariant QObject :: संपत्ति (कॉन्स char * name) const

अच्छा, अब हम सी ++ पक्ष पर कम या ज्यादा काम कर रहे हैं।

क्यूएमएल साइड

आपको अपनी qml ऑब्जेक्ट्स की objectName संपत्ति भी सेट करने की आवश्यकता होगी यदि आप रूट आइटम से अधिक तक पहुंचना चाहते हैं:

import QtQuick 2.2
import QtQuick.Window 2.1

Window {
    id: mainWindow
    objectName: "mainWindow"
    ...
}

यह किसी भी QML ऑब्जेक्ट के लिए समान रूप से किया जा सकता है। कुंजी यहां "ऑब्जेक्टनाम" है। आप रूट ऑब्जेक्ट के लिए छोड़ सकते हैं क्योंकि सी ++ पक्ष रूट ऑब्जेक्ट को सीधे प्राप्त करता है, लेकिन चूंकि आप अपने प्रश्न में क्यूएमएल ऑब्जेक्ट्स का जिक्र कर रहे हैं, मुझे लगता है कि आप इसे सामान्य रूप से हल करना चाहते हैं। एक बार जब आप किसी भी QML ऑब्जेक्ट के लिए ऐसा करना चाहते हैं, यानी बच्चों सहित, आपको ऑब्जेक्टनाम संपत्ति का उपयोग करने की आवश्यकता होगी।

मैं जीयूआई निर्माण के लिए QtQuick सीखने की कोशिश कर रहा हूं, लेकिन मुझे अपने परीक्षण कार्यक्रम के सी ++ भाग से QML ऑब्जेक्ट्स के साथ कैसे बातचीत करना है, यह समझने में कठिनाई हो रही है।

यहां मेरी सरल क्यूएमएल फ़ाइल है:

import QtQuick 2.2
import QtQuick.Window 2.1

Window {
    id: mainWindow
    visible: true
    width: 800
    height: 800
    color: "#FFFF0000"

    MouseArea {
        anchors.fill: parent
        onClicked: Qt.quit()
    }

    Rectangle {
        id: testRect
        width: 100
        height: 100
        anchors.centerIn: parent
        color: "#FF0000FF"
    }
}

यहां मूल सी ++ फ़ाइल है जो इसके साथ आई थी (QtCreator द्वारा स्वतः उत्पन्न):

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:///main.qml")));

    return app.exec();
}

मेरी समस्या यह है कि मुझे नहीं पता कि मेरी 'विंडो' क्यूएमएल ऑब्जेक्ट तक पहुंच कैसे प्राप्त करें, और नतीजतन, मैं इसके किसी भी गुण या अपने बच्चों के गुणों को बदलने में असमर्थ हूं! QtQuick दस्तावेज़ का यह हिस्सा Q ++ कोड के भीतर से QML ऑब्जेक्ट्स तक पहुंचने के दो तरीकों को दिखाता है, लेकिन उनमें से कोई भी इस 'QQmlAplicationEngine' लोडिंग योजना पर लागू नहीं होता है .. मैंने लोगों को 'QApplicationViewer' और 'QDeclaritiveView' जैसी चीजों का उपयोग भी देखा है। , लेकिन मुझे आधिकारिक दस्तावेज में उन सभी को नहीं मिल रहा है ..

मैं QtQuick के साथ वास्तव में निराश हो रहा हूँ; क्यूएमएल की 'सादगी' विवादित दस्तावेज के समुद्र में और सी ++ और क्यूएमएल के बीच घुलनशील इंटरफ़ेस में खो जाती है। QQmlAplicationEngine विधि का उपयोग करते समय मेरे QML ऑब्जेक्ट्स तक पहुंचने के लिए वैसे भी है? मैंने 'क्विक व्यू' का उपयोग करने का प्रयास किया है, लेकिन ऐसा लगता है कि यह विंडो क्यूएमएल ऑब्जेक्ट्स के साथ अच्छी तरह से काम नहीं कर रहा है ..? QQmlAplicationEngine केवल एक फ़ाइल में QML- केवल अनुप्रयोगों के लिए उपयोगी है? अब तक, मैंने पढ़ा है कि प्रलेखन और ट्यूटोरियल के हर टुकड़े कुछ अलग दिखाया गया है ..

किसी भी मदद या स्पष्टीकरण की सराहना की जाएगी। आदर्श रूप से मैं जानना चाहता हूं कि मेरे सी ++ कोड के माध्यम से QML ऑब्जेक्ट्स (जैसे 'मेनविंडो', 'testRect', और अन्य फ़ाइलों में अन्य ऑब्जेक्ट्स) को कैसे एक्सेस और संशोधित करना है।





qtquick2