javascript गतिशील रूप से रनटाइम पर QML थीम परिवर्तित करें



qt resources (1)

मैं वास्तव में यहां दिए गए समाधान का उपयोग कर रहा हूं: https://stackoverflow.com/a/25864815/2425044

मैं import "MyTheme.js" as Theme; में import "MyTheme.js" as Theme; से छुटकारा import "MyTheme.js" as Theme; रनटाइम पर एक विशिष्ट विषय गतिशील रूप से लोड करने के लिए बयान (आमतौर पर उपयोगकर्ता द्वारा चुना जाता है)

मैं वर्तमान में जो कर रहा हूं वह मेरी एक qrc फ़ाइल में मेरी Themes.js फाइलों में से प्रत्येक को लोड कर रहा है:

  • redTheme.qrc शामिल हैं
  • blueTheme.qrc शामिल हैं

ये qrc फ़ाइलें बाहरी बाइनरी संसाधनों ( rcc ) में संकलित होती हैं और द्विआधारी निर्देशिका से लोड की जाती हैं

registerResource(const QString &rccFileName, const QString &mapRoot = QString())

अब तक, सब कुछ काम करता है केवल एक समस्या यह है कि मैं अपनी QML फाइलों में एक import स्टेटमेंट के साथ रह गया हूं:

import "qrc:/redTheme/Theme.js" as Theme

इस प्रकार, blueTheme.rcc को एक संसाधन के रूप में दर्ज करने के बावजूद, यह कभी भी प्रयोग नहीं किया जाएगा।


मैं इसे काम करने में सक्षम था, अन्य धागे के लिए धन्यवाद

सबसे पहले, इस उपयोगकर्ता की तरह अपनी थीम बनाएं, जो एब्जेक्टस्टाइल से AbstractStyle , जिससे अधिक लचीलेपन की अनुमति मिलती है।

https://.com/a/25866188/2425044

हमारी property फिर JS फंक्शन द्वारा लौटाए गए मान द्वारा परिभाषित की जाएगी:

import "qrc:/graphics/componentCreation.js" as Theme

Item
{
    id: homeViewItem
    anchors.centerIn: parent

    // Load default theme at startup
    property AbstractTheme currentTheme: Theme.createThemeObject(homeViewItem, "qrc:/redTheme/redTheme.qml");

    Rectangle 
    {
        color: currentTheme.textColorStandard;
    }
}

componentCreation.js

// Create themes components and load them in the apps' QML files

var component;
var sprite;

function createThemeObject(item, themePath)
{
    component = Qt.createComponent(themePath);
    sprite = component.createObject(item);

    if (sprite === null)
        console.log("componentCreation.js: error creating " + themePath + " object");
    else
        return sprite;
}

मान लीजिए कि आप थीम को बदलना चाहते हैं जब उपयोगकर्ता एक Button पर क्लिक करता है:

Button
{
    id: themeButton
    text: "Change to blue theme"
    onClicked:
    {
        // Remove content of redTheme.rcc, register blueTheme.rcc
        cpp_class.changeTheme("redTheme", "blueTheme")
        // blueTheme's content is now available, let's fill its content into a QML object
        currentTheme = Theme.createThemeObject(homeViewItem, "qrc:/blueTheme/blueTheme.qml")
    }
}

याद रखें, redTheme.qml और blueTheme.qml qrc फ़ाइलों में समाहित हैं जो खुद qrc फ़ाइलों में संकलित हैं।

यहाँ changeTheme(const QString&, const QString&) की परिभाषा है, जो पुराने विषय को अनियंत्रित करता है और एक नया पंजीकरण करता है:

void cpp_class::changeTheme(const QString &oldTheme, const QString &newTheme)
{
    bool un = QResource::unregisterResource(QCoreApplication::applicationDirPath() + "/data/themes/" + app + "/" + oldTheme + ".rcc");
    if (!un)
        std::cerr << oldTheme.toStdString() << "could not be unregistered" << std::endl;
    bool in = QResource::registerResource(QCoreApplication::applicationDirPath() + "/data/themes/" + app + "/" + newTheme + ".rcc");
    if (!in)
        std::cerr << newTheme.toStdString() << "could not be registered as an external binary resource" << std::endl;
}

अन्य थ्रेड्स जिन्होंने मेरी मदद की है:

https://wiki.qt.io/Qml_Styling

http://www.slideshare.net/BurkhardStubert/practical-qml-key-navigation (स्लाइड 34 पर शुरू होता है)





qml