Создание приложения с QML и Qt Quick

Последнее обновление: 09.12.2023

Хотя Qt Creator предоставляет нам встроенный шаблон проекта для создания приложения с QML/Qt Quick, но в реальности мы можем взять проект простого консольного приложения Qt и добавить в него всю необходимую функциональность. Например, создадим новый проект по шаблону Qt Console Application

Консольный проект для приложения QML и Qt Quick в Qt Creator

Допустим, проект будет называться QmlApp:

проект для консольного приложения QML и Qt Quick в Qt Creator

В качестве системы построения выберем CMake:

установка CMake для построения консольного приложения QML и Qt Quick в Qt Creator

Все остальные опции оставим по умолчанию.

В итоге создается стандартный проект с 2-мя файлами "CMakeLists.txt" и "main.cpp". Добавим в проект файл с интерфейсом на QML. Для этого нажмем на название проекта и в появившемся меню выберем пункт Add New...:

Добавление файла QML в консольный проект в Qt Creator

Среди шаблонов нового элемента выберем пункт QML File (Qt Quick 2):

Добавление файла QML в проект в Qt Creator

Назовем новый файл main (расширение добавляется автоматически):

Добавление файла QML в Qt Creator

Остальные опции оставим по умолчанию. И после добавления файла main.qml проект будет выглядеть следующим образом:

Проект QML в Qt Creator

Откроем файл main.qml и определим в нем следующий код:

import QtQuick

Window {
    width: 300
    height: 250
    visible: true
    title: qsTr("Hello METANIT.COM")
}

Здесь определяется простейшее окно в виде объекта Window. Но чтобы использовать использовать этот тип, нам надо импортировать пакет QtQuick

import QtQuick

Далее собственно определяем объект Window. Вначале указываем называние типа и в фигурных скобках указываются его свойства и их значения. Так в данном случае, устанавливаем свойство width - ширину и height - высоту, которые представляют числовые значения. Свойство visible указывает, будет ли окно видимым (для этого передаем ему значение true). И последнее свойство - title устанавливает заголовок окна, в качестве которого фактически выступает строка.

Теперь этот интерфейс надо подключить в приложение в файле main.cpp. Для этого изменим данный файл следующим образом:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    
    QQmlApplicationEngine engine;
    const QUrl url("qrc:/path/main.qml"); // ссылка на файл qml
    engine.load(url);   // загружаем файл qml
    return app.exec();
}

Подобное приложение, как и в случае с виджетами и другими типами приложений Qt, представляет тип QCoreApplication. В данном случае применяется наследующий тип QGuiApplication.

Для упрощения загрузки интерфейса из файлов QML применяется класс QQmlApplicationEngine. В его метод load() передается объект QUrl - ссылка на файл, который надо загрузить. Обратите внимание как выглядит ссылка - "qrc:/path/main.qml". Далее я объясню, почему именно такая ссылка.

Но пока весь этот функционал никак не подключен в проект. Нам надо изменить файл конфигурации CMakeLists.txt. При создании проекта он выглядит примерно следующим образом:

cmake_minimum_required(VERSION 3.14)

project(QmlApp LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core)

add_executable(QmlApp
  main.cpp
  main.qml
)
target_link_libraries(QmlApp Qt${QT_VERSION_MAJOR}::Core)

include(GNUInstallDirs)
install(TARGETS QmlApp
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

Изменим его следующим образом:

cmake_minimum_required(VERSION 3.14)

project(QmlApp LANGUAGES CXX)

set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Добавляем пакет Quick
find_package(Qt6 6.4 REQUIRED COMPONENTS Quick)

qt_standard_project_setup()

# Определяем компилируемые файлы
qt_add_executable(QmlApp
  main.cpp
)

# Добавляем файлы qml
qt_add_qml_module(QmlApp
    URI path      # ссылка, по которой будут загружаться файлы qml
    VERSION 1.0
    QML_FILES main.qml
)

target_link_libraries(QmlApp
    PRIVATE Qt6::Quick
)

include(GNUInstallDirs)
install(TARGETS QmlApp
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

Рассмотрим основные моменты. Прежде всего нам надо добавить компоненты Qt Quick:

find_package(Qt6 6.4 REQUIRED COMPONENTS Quick)

Далее определяем цель (target) и компилируемые файлы:

qt_add_executable(QmlApp
  main.cpp
)

Для упрощения название цели совпадает с названием проекта - в моем случае QmlApp.

Затем определяем ссылку на файлы qml:

qt_add_qml_module(QmlApp
    URI path      # ссылка, по которой будут загружаться файлы qml
    VERSION 1.0
    QML_FILES main.qml
)

Первый параметр метода qt_add_qml_module() представляет цель, которая определена ранее. Параметр URI указывает на ссылку, по которой будет загружаться файлы qml в приложении. Этот параметр представляет произвольный идентификатор, в моем случае это "path". И параметр QML_FILES содержит загружаемые файлы qml.

Обратите внимание на параметр URI - этот параметр и название файла qml задают ссылку, по которой будут загружаться файлы в приложении:

const QUrl url("qrc:/path/main.qml");

И последний момент - определяем библиотеки, применяемые при линковке приложения:

target_link_libraries(QmlApp
    PRIVATE Qt6::Quick
)

В качестве первого параметра опять указывается цель, которая определена выше. И последний параметр представляет подключемый модуль Qt6::Quick

Запустим проект, и нам отобразится следующее окно

Первое приложение с QML на Qt

Объекты в QML могут содержать вложенные объекты. Например, мы можем определить в окне приложения кнопки, текстовые поля и другие элементы. Например, изменим код в main.qml следующим образом:

import QtQuick

Window {
    width: 280
    height: 200
    visible: true
    title: "METANIT.COM"

    // определяем вложенный компонент
    Text{
        text: "Hello QML"
        font.pixelSize: 22
    }
}

В данном случае для простого вывода текста внутри Window определяем элемент Text. В этом элементе устанавливаем два свойства. Свойство text устанавливает текст. Свойство font.pixelSize устанавливает высоту шрифта в пикселях. В итоге мы полчим следующее окно

Первое графическое приложение с QML и Qt Quick
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850