gpt4 book ai didi

qt - 如何在单例中创建 QML 对象?

转载 作者:行者123 更新时间:2023-12-04 20:04:22 27 4
gpt4 key购买 nike

我在 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其中包含一些常量值。我可以以某种方式创建 MyQMLObject 的实例吗?在这个单例中 QtObject ?

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

您可以使用 dynamic object creation创建临时 Column元素:

样式.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)
}

然后, register the singleton :

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++ 计算最大宽度来改进此方法,从而无需构建项目只是为了将其丢弃。下类 this example :
#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计算 width .
main.qml保持不变。

关于qt - 如何在单例中创建 QML 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35519639/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com