Как добавлять QML-файлы в CMake проект?
Подскажите плиз, как в CMakeList.txt пользоваться qt_add_qml_module.
Например, вот такой CMakeLists.txt:
cmake_minimum_required(VERSION 3.18)
find_package(Qt6 COMPONENTS
Core
Gui
Qml
Quick
Widgets
REQUIRED)
add_executable(MyAdressBook "main.cpp" "MyAdressBook.cpp" ${MY_INCLUDE_DIR})
target_include_directories(MyAdressBook PUBLIC ${MY_INCLUDE_DIR})
target_link_libraries(MyAdressBook PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Widgets
Qt6::Qml
Qt6::Quick )
qt_add_qml_module(MyAdressBook
URI src
VERSION 1.0
QML_FILES Main.qml
Style.qml
)
Все вроде оформлено, как в доках у Qt. Но нет, проект не собирается... Компилятор пишет:
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка CMake Error at src/CMakeLists.txt:13 (add_executable):
Cannot find source file:
F:/C_make_proj/MyAdressBook/src/Main.qml
Tried extensions .c .C .c++ .cc .cpp .cxx .cu .mpp .m .M .mm .h .hh .h++
.hm .hpp .hxx .in .txx .f .F .for .f77 .f90 .f95 .f03 .ispc F:\C_make_proj\MyAdressBook\src/CMakeLists.txt 13
Ответы (3 шт):
Это один из самых простых и верных способов(Но он не единственный).
Я сделал такие действия :
- использовал утилиту python qmake2cmake. Она просто берёт ваш qmake(pro файл) и переводит в cmake:
python -m pip install qmake2cmake
qmake2cmake_all ~/projects/myapp --min-qt-version 3.1
Если у вас ругается на
DISTFILESпросто закомментите их на время и запустите заново.После этого вы получаете CMake файл.
Дело за малым - исходники перенесите на нужную машину, создавайте папку bin в исходниках, в ней
cmake ../, потом make(тоже в папке bin, но если ругается на пути разныето можно и в папке с исходниками, просто там немного захламиться файлами)Конкретно у меня возникла проблема с
qt_add_executable, замените просто наadd_executableи перезапустите cmake и make.Готово, в директории, в которой вы запускали make и лежит ваш собранный проект.
В общем если подитожить, я в таких случаях убираю слово qt в начале.
Вообщем чуточку разобрался, если структура проекта например вот такая :
CMakeLists.txt
<inc
-src:
main.cpp
Main.qml
Style.qml
CmakeLists.txt
то СMakelist :
cmake_minimum_required (VERSION 3.8)
project ("MyAdressBook")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_PREFIX_PATH "F:\\Qt\\6.3.2\\msvc2019_64\\lib\\cmake")
set(MY_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/inc)
add_subdirectory(src)
И src/CMakeLists:
cmake_minimum_required(VERSION 3.18)
find_package(Qt6 COMPONENTS
Core
Gui
Qml
Quick
Widgets
QuickControls2
REQUIRED)
add_executable(MyAdressBook "main.cpp" "MyAdressBook.cpp" ${MY_INCLUDE_DIR})
target_include_directories(MyAdressBook PUBLIC ${MY_INCLUDE_DIR})
qt_add_qml_module(MyAdressBook
URI Styles
VERSION 1.0
RESOURCE_PREFIX "/imports"
QML_FILES Main.qml
Style.qml
)
target_link_libraries(MyAdressBook PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Widgets
Qt6::Qml
Qt6::Quick
Qt6::QuickControls2 )
Теперь самое вкусное .. что тут и к чему:
Файл main.cpp:
#include <QGuiApplication>
#include <QQmlApplicationEngine>
int main(int argc, char* argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.addImportPath(":/imports"); //мы берем это из qt_add_module : RESOURCE_PREFIX "/imports"!!
//Причем написать туда можно что угодно,что душа пожелает, это и будет путем!! Это никакие то существующие в проекте пути или папки..
const QUrl url(u"qrc:/imports/Styles/Main.qml"_qs); //здесь - что такое /imports мы уже знаем.. далее /Styles
//а это URI Styles из того же qt_add_module !!! И опять таки это не название какой либо папки или файла!!!
// а просто от балды ...
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();
}
Но давайте продолжим эту тему развивать... Я хочу привести в порядок проект и разложить все по папкам , например так:
CMakeLists.txt
<INC
-SRC:
CMakeLists.txt
main.cpp
-QML:
Main.qml
Style.qml
Какие будут варианты с CMakeLists?
Полное решение наконец то найдено! Вот здесь https://github.com/scytheStudio/qt_add_qml_module_example отличный пример qml проекта с отличной структурой на CMake. Есть и синглтоны. Вот так то товарищи, лучше как говориться уметь держать все за шкварник самому) нежели использовать разные сомнительные цыганские методы.. Стыдно товарищам должно быть за такие ответы..впечатление от форума на -10