首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >QML:使用错误访问属性“无法将[未定义的]分配给”的失败

QML:使用错误访问属性“无法将[未定义的]分配给”的失败
EN

Stack Overflow用户
提问于 2022-08-10 13:00:03
回答 2查看 219关注 0票数 0

我有一个简单的QML文件:

qml/Constants.qml

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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的主窗口

代码语言:javascript
运行
复制
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.qrcrcc构建资源。

代码语言:javascript
运行
复制
<!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。在执行过程中,我有以下错误:

代码语言:javascript
运行
复制
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.widthConstants.height,而MainMenu.qml (显然)能够获得这两个值?以及为什么MainMenu.qml不能获得Constants.bgColor

注: Qt版本为5.15.2

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-10 17:55:21

另一种解决方案是

  1. qmlRegisterSingletonType()添加到main.cpp:qmlRegisterSingletonType( QUrl(“qrc:/your/前缀/ to /Constants.qml”)、"ConstantsModule“、1、0、”常量“);

使用Constants.的任何地方的

  1. Do import ConstantsModule 1.0

main.cpp

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
pragma Singleton
import QtQuick 2.15

QtObject {
    readonly property int width: 1920
    readonly property int height: 1080
    readonly property color bgColor: "#c2c2c2"
}

MainMenu.qml

代码语言:javascript
运行
复制
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
}
票数 0
EN

Stack Overflow用户

发布于 2022-08-10 15:26:12

正如JarMan所指出的,单例应该被正确初始化。

创建一个qmldir文件就足够了(不需要创建一个模块),qml/qmldir

代码语言:javascript
运行
复制
singleton Constants 1.0 Constants.qml

并将qmldir文件添加到resources.qrc中的资源列表中

代码语言:javascript
运行
复制
<!DOCTYPE RCC><RCC version="1.0">
        <qresource prefix="/mbh">
                <file alias="qmldir">qml/qmldir</file>
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73306793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档