Как добавлять QML-файлы в CMake проект?

Рейтинг: 0Ответов: 3Опубликовано: 07.05.2023

Подскажите плиз, как в 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  

Ответы

▲ 2

Вообщем чуточку разобрался, если структура проекта например вот такая :

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?

▲ 1

Это один из самых простых и верных способов(Но он не единственный).

Я сделал такие действия :

  • использовал утилиту 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 в начале.

источник

▲ 0

Полное решение наконец то найдено! Вот здесь https://github.com/scytheStudio/qt_add_qml_module_example отличный пример qml проекта с отличной структурой на CMake. Есть и синглтоны. Вот так то товарищи, лучше как говориться уметь держать все за шкварник самому) нежели использовать разные сомнительные цыганские методы.. Стыдно товарищам должно быть за такие ответы..впечатление от форума на -10