无法通过 QML 文档定义对象类型

问题描述 投票:0回答:1

我花了几天时间研究并试图解决这个问题,它应该可以工作 - 但没有。

我正在尝试创建并使用一个简单的 QML 对象作为我的项目的单一设置源。

作为测试,我创建了一个新的 Qt 6.7.3 QML 项目,并添加了一个新的 .qml 文件“TestQmlObj.qml”,其中包含一些属性。

Intellisense 有效,但运行时我总是遇到

Unable to assign [undefined] to
错误。

测试QmlObj.qml

pragma Singleton
import QtQuick

QtObject {

    readonly property color primaryColor: "red"
    readonly property color secondaryColor: "#FFC107"
    readonly property color backgroundColor: "#FFFFFF"

    readonly property font mainfont: Qt.font({
        family: "Arial",
        pointSize: 12,
        weight: Font.Normal
    })

    readonly property font headerFont: Qt.font({
        family: "Arial",
        pointSize: 16,
        weight: Font.Bold
    })
}

然后我尝试在 Main.qml 文件中使用这些属性。

主要.qml

import QtQuick

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Rectangle {
        anchors.fill: parent
        //color: "red"
        color: TestQmlObj.primaryColor
        //color: TestQmlObj.backgroundColor

        Text {
            text: qsTr("text")
            font: TestQmlObj.headerFont
        }
    }
}

我尝试了各种建议的更改,但在所有情况下我都会收到以下错误,并且颜色没有改变。

qrc:/qt/qml/QmlObjTypes/Main.qml:13:9: Unable to assign [undefined] to QColor

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)

project(QmlObjTypes VERSION 0.1 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Quick)

qt_standard_project_setup(REQUIRES 6.5)

qt_add_executable(appQmlObjTypes
    main.cpp
)

qt_add_qml_module(appQmlObjTypes
    URI QmlObjTypes
    VERSION 1.0
    QML_FILES
        Main.qml
        TestQmlObj.qml
)

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
set_target_properties(appQmlObjTypes PROPERTIES
#    MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appQmlObjTypes
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

target_link_libraries(appQmlObjTypes
    PRIVATE Qt6::Quick
)

include(GNUInstallDirs)
install(TARGETS appQmlObjTypes
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
c++ qt qml
1个回答
1
投票

您无法访问 TestQmlObj 的原因是您尝试将其用作单例,但尚未完成这样的声明。 docs描述了两种声明单例的方法:

  1. 如果您从 QML 定义单例,则必须用
    pragma Singleton
    AND 对其进行标记,并且必须将一个条目添加到模块的 qmldir 文件中。最好的方法是在 CMakeLists.txt 文件中设置 source 属性。
set_source_files_property(TestQmlObj.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
  1. 另一种方法是使用
    QML_SINGLETON
    宏从 C++ 定义单例对象。
class MySingleton : public QObject
{
    Q_OBJECT
    QML_SINGLETON
    QML_ELEMENT
public:
    MySingleton(QObject *parent = nullptr) : QObject(parent) {
        // ...
    }
};

由于您已在 QML 中定义了对象,因此您应该使用选项 1 并确保更新 CMakeLists.txt 文件。

© www.soinside.com 2019 - 2024. All rights reserved.