我花了几天时间研究并试图解决这个问题,它应该可以工作 - 但没有。
我正在尝试创建并使用一个简单的 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}
)
您无法访问 TestQmlObj 的原因是您尝试将其用作单例,但尚未完成这样的声明。 docs描述了两种声明单例的方法:
pragma Singleton
AND 对其进行标记,并且必须将一个条目添加到模块的 qmldir 文件中。最好的方法是在 CMakeLists.txt 文件中设置 source 属性。set_source_files_property(TestQmlObj.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
QML_SINGLETON
宏从 C++ 定义单例对象。class MySingleton : public QObject
{
Q_OBJECT
QML_SINGLETON
QML_ELEMENT
public:
MySingleton(QObject *parent = nullptr) : QObject(parent) {
// ...
}
};
由于您已在 QML 中定义了对象,因此您应该使用选项 1 并确保更新 CMakeLists.txt 文件。