我的问题是当我在我的 main.qml 文件中导入我的自定义模块时,我收到一个运行时错误,指出该模块未安装。这是一个例子:
// main.qml
import QtQuick
import Ui
Window {
visible: true
MyComponent {
anchors.fill: parent
}
}
// Ui/MyComponent.qml
import QtQuick
import QtQuick.Controls
Item {
Button {
anchors.centerIn: parent
text: "Click"
}
}
// Main.cpp
#include <QtGui/QGuiApplication>
#include <QtQml/QQmlApplicationEngine>
auto main(int argumentCount, char* arguments[]) -> int
{
QGuiApplication const application(argumentCount, arguments);
QQmlApplicationEngine const engine("qrc:/main.qml");
return QGuiApplication::exec();
}
// CMakeLists.txt
...
find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml)
add_subdirectory(Ui)
qt6_add_executable(Application Main.cpp)
qt6_add_qml_module(Application URI Application QML_FILES main.qml NO_RESOURCE_TARGET_PATH)
target_link_libraries(Application PRIVATE Qt6::Gui Qt6::Qml Ui)
// Ui/CMakeLists.txt
find_package(Qt6 REQUIRED COMPONENTS Qml)
qt6_add_qml_module(Ui URI Ui QML_FILES MyComponent.qml)
根据 Qt 文档,qt_add_qml_module 创建了两个目标:第一个是支持库,第二个是插件。我必须将哪一个链接到我的可执行文件?链接到其他模块怎么样?
我想我尝试了所有可能的组合,唯一有效的方法是链接静态插件,甚至在极少数 Qt 博客中提到它,但他们没有解释为什么必须那样。实际上,无论我研究多久,似乎都没有人对此做出解释。同样的故事,为什么我在使用标准 QtQuick 模块时不必链接任何库。
对于模块,您必须将 plugin 添加到名称中。所以它会是:
target_link_libraries(Application PRIVATE Qt6::Gui Qt6::Qml Uiplugin)
小写插件!
在这里您可以找到有关模块创建的更多详细信息。