簡體   English   中英

如何在單例內創建QML對象?

[英]How to create QML object within a singleton?

我在MyQMLObject.qml下定義了一個QML對象。 此QML文件如下所示:

import QtQuick 2.4

Item {
  id: rootItem
  implicitWidth: LayoutUtils.maxImplicitWidth(children)
  implicitHeight: LayoutUtils.maxImplicitHeight(children)

  Text {
    id: text1
  }
  Text {
    id: text2
  }
  // ...
  Text {
    id: textN
  }
}

應用程序啟動時會動態添加文本。 對於每種語言,添加不同的文本, rootItem的寬度因所選語言而異。 我想以某種方式在應用程序啟動時只創建一次MyQMLObject ,甚至沒有將其可視化並將其實際寬度保存在單例中,因此我可以在整個代碼中重用該值,而無需再創建一次MyQMLObject 我怎么能實現這個目標?

現在我有一個單獨的QML文件,它包含一個包含一些常量值的QtObject 我可以在這個單例QtObject以某種方式創建一個MyQMLObject實例嗎?

我的singleton Style.qml看起來像這樣:

pragma Singleton

import QtQuick 2.4

QtObject {
  readonly property int maxWidth: 400
  // ...
}

首先,如果可能,您可以使用Column而不是手動計算最大寬度:

MyQMLObject.qml

import QtQuick 2.4

Column {
    Text {
        text: "blah"
    }
    Text {
        text: "blahblah"
    }
}

您可以使用動態對象創建來創建臨時Column項:

Style.qml

pragma Singleton

import QtQuick 2.4

QtObject {
    readonly property int maxWidth: {
        var component = Qt.createComponent("qrc:/MyQMLObject.qml");
        if (component.status === Component.Error) {
            console.error(component.errorString());
            return 0;
        }

        return component.createObject().width;
    }
}

main.qml

import QtQuick 2.5
import QtQuick.Window 2.2

import App 1.0

Window {
    visible: true

    Component.onCompleted: print(Style.maxWidth)
}

然后, 注冊單身人士

main.cpp中

#include <QtGui>
#include <QtQml>

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

    qmlRegisterSingletonType(QUrl("qrc:///Style.qml"), "App", 1, 0, "Style");

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

    return app.exec();
}

但是,請注意,可以通過計算C ++的最大寬度來改進這種方法,從而無需構建項目以將其丟棄。 解決這個例子

#include <QtGui>
#include <QtQml>

class Style : public QObject
{
    Q_OBJECT
    Q_PROPERTY(int maxWidth READ maxWidth CONSTANT)

public:
    Style(QObject* parent = 0) :
        QObject(parent),
        mMaxWidth(0)
    {
        QFontMetrics fontMetrics(qApp->font());
        // Here is where you'd fetch the text...
        QStringList dummyText;
        dummyText << "blah" << "blahblah";
        foreach (const QString &string, dummyText) {
            const int width = fontMetrics.boundingRect(string).width();
            if (width > mMaxWidth)
                mMaxWidth = width;
        }
    }

    int maxWidth() const
    {
        return mMaxWidth;
    }

private:
    int mMaxWidth;
};

static QObject *singletonTypeProvider(QQmlEngine *, QJSEngine *)
{

    Style *style = new Style();
    return style;
}

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

    qmlRegisterSingletonType<Style>("App", 1, 0, "Style", singletonTypeProvider);

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

    return app.exec();
}

#include "main.moc"

它使用QFontMetrics來計算寬度

main.qml保持不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM