如何在单一实例中创建 QML 对象



我在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实例吗?

我的单例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;
    }
}

主.qml

import QtQuick 2.5
import QtQuick.Window 2.2
import App 1.0
Window {
    visible: true
    Component.onCompleted: print(Style.maxWidth)
}

然后,注册单例:

主.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保持不变。

相关内容

  • 没有找到相关文章

最新更新