我有一个简单的QML文件:
qml/Constants.qml
pragma Singleton
import QtQuick 2.15
QtObject {
readonly property int width: 1920
readonly property int height: 1080
readonly property color bgColor: "#c2c2c2"
}
qml/MainMenu.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
Rectangle {
id: mainMenu
width: Constants.width
height: Constants.height
visible: true
color: Constants.bgColor
border.color: "#ffffff"
clip: false
}
和qml/main.qml
的主窗口
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.15
Window {
id: root
width: Constants.width
height: Constants.height
visible: true
StackView {
id: stack
anchors.fill: parent
initialItem: MainMenu {}
}
}
我使用这个resources.qrc
和rcc
构建资源。
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="/mbh">
<file alias="Constants.qml">qml/Constants.qml</file>
<file alias="main.qml">qml/main.qml</file>
<file alias="MainMenu.qml">qml/MainMenu.qml</file>
</qresource>
</RCC>
并使用简单的main.qml
来加载和执行qml/main.qml
,并执行qml/main.qml
。在执行过程中,我有以下错误:
qrc:/mbh/main.qml:8:5: Unable to assign [undefined] to int
qrc:/mbh/main.qml:7:5: Unable to assign [undefined] to int
qrc:/mbh/MainMenu.qml:9:5: Unable to assign [undefined] to QColor
为什么main.qml
不能获得Constants.width
和Constants.height
,而MainMenu.qml
(显然)能够获得这两个值?以及为什么MainMenu.qml
不能获得Constants.bgColor
注: Qt版本为5.15.2
谢谢
发布于 2022-08-10 17:55:21
另一种解决方案是
qmlRegisterSingletonType()
添加到main.cpp
:qmlRegisterSingletonType( QUrl(“qrc:/your/前缀/ to /Constants.qml”)、"ConstantsModule“、1、0、”常量“);使用Constants
.的任何地方的
import ConstantsModule 1.0
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
// !!! THIS LINE, the rest are default Qt template lines
// WARNING use your own qrc prefix for Constants.qml
qmlRegisterSingletonType(
QUrl("qrc:/stackoverflow4/Constants.qml"),
"ConstantsModule",
1, 0,
"Constants");
QQmlApplicationEngine engine;
const QUrl url(u"qrc:/stackoverflow4/main.qml"_qs);
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
main.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.15
import ConstantsModule 1.0 // !!! THIS LINE
Window {
id: root
width: Constants.width
height: Constants.height
visible: true
StackView {
id: stack
anchors.fill: parent
initialItem: MainMenu{}
}
}
Constants.qml
pragma Singleton
import QtQuick 2.15
QtObject {
readonly property int width: 1920
readonly property int height: 1080
readonly property color bgColor: "#c2c2c2"
}
MainMenu.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.15
import ConstantsModule 1.0 // !!! THIS LINE
Rectangle {
id: mainMenu
width: Constants.width
height: Constants.height
visible: true
color: Constants.bgColor
border.color: "#ffffff"
clip: false
}
发布于 2022-08-10 15:26:12
正如JarMan所指出的,单例应该被正确初始化。
创建一个qmldir
文件就足够了(不需要创建一个模块),qml/qmldir
singleton Constants 1.0 Constants.qml
并将qmldir
文件添加到resources.qrc
中的资源列表中
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="/mbh">
<file alias="qmldir">qml/qmldir</file>
...
https://stackoverflow.com/questions/73306793
复制相似问题