Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Система построения проектов CMake. Учебник.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
hкаталог проектаi
<qresource prefix="/general">
</qresource>
</RCC>
3.3. Qt
resources
qt.ico
ex-qt-qrc.cpp ex-qt-qrc.qrc ... описание ресурсов, редактируется Qt Creator
CMakeLists.txt
Рис. 3.6. Структура каталога проекта с ресурсами
<file>resources/qt.ico</file>
Содержимое файла ex-qt-qrc.cpp:
#include <QApplication>
#include <QLabel>
#include <QIcon>
int main(int nArgC, char *apszArgV[])
{
QApplication app(nArgC, apszArgV);
QApplication::setWindowIcon(
QIcon(":/general/resources/qt.ico"));
//
QLabel label("Hello Qt!");
label.show();
//
return app.exec();
311
3. Примеры использования пакетов
}
Здесь статический метод QApplication::setWindowIcon()
устанавливает пиктограмму изображения, которая загружается
из файла с заданным путём. Двоеточие в начале означает, что путь указывается относительно дерева ресурсов, хранимого внутри исполняемого файла.
Файл CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.11)
project(ex-qt-qrc)
find_package(Qt5Widgets REQUIRED)
qt5_add_resources(
QRC_WRAPPERS ex-qt-qrc.qrc
OPTIONS -no-compress)
add_executable(
ex-qt-qrc WIN32
ex-qt-qrc.cpp ${QRC_WRAPPERS})
target_link_libraries(
ex-qt-qrc Qt5::Widgets)
Здесь в команде qt5_add_resources() определяются до­полнительные аргументы командной строки, которые переда­ются инструменту qrc. Ключ -no-compress отключает сжатие
312
3.3. Qt
данных, выполняемое по умолчанию (алгоритм zlib10). Это мо­жет быть полезным для экономии времени построения, особен­но если ресурсы уже находятся в сжатом виде (например, изоб­ражения в формате PNG).
В результате построения в выходном каталоге создаётся файл qrc_ex-qt-qrc.cpp. Полный путь к нему на этапе испол­нения CMake записывается в переменную QRC_WRAPPERS, кото­рая затем используется в списке входных файлов цели в коман­де add_executable(). ∗
Замечание: при помощи других ключей инструмента qrc мож- но настроить уровень сжатия от 1 до 9 (-compress hуровеньi) и пороговое отношение сжатого размера к исходному (в процен­тах), начиная с которого файл будет помещён в ресурсы в несжа­том виде (-threshold hотношениеi).
N
Другим инструментом Qt, для которого также есть под­держка в CMake, является компилятор пользовательского ин- терфейса (User Interface Compiler, uic). Текст реализации главно­го окна в примере на с. 305 показывает, что даже отображение меню из двух команд вынуждает разработчика писать множе­ство строк кода, не говоря уже о программировании сложных диалоговых окон с большим количеством графических элемен­тов управления. Для облегчения этих задач в Qt используется визуальный редактор Qt Designer (или Qt Creator), при помощи которого можно «нарисовать» окна с требуемыми элементами управления, размерами и другими свойствами. Вся информа­ция сохраняется в текстовом файле с расширением «.ui», имею-
10
http://www.zlib.net/ (дата обращения: 05.03.2015).
313
3. Примеры использования пакетов
щем структуру XML. В процессе построения компилятор пользо­вательского интерфейса по этому файлу генерирует в выходном каталоге заголовочный файл, содержащий весь код инициали­зации внешнего вида окна (рис. 3.7).
Qt Designer
mydlg.ui
uic
Рис. 3.7. Преобразование описания ресурса в код на C
ui_mydlg.h
++
при помощи инструмента uic
В CMake для создания правил вызова компилятора поль­зовательского интерфейса существует команда qt5_wrap_ui(), которая определяется после успешного поиска пакета Qt5Widgets. Её синтаксис аналогичен двум предыдущим командам:
qt5_wrap_ui(
hимя_переменнойi
hфайл_интерфейса1i ... hфайл_интерфейсаmi
f
OPTIONS hаргумент1i ... hаргументnig)
ПРИМЕР Пусть при помощи инструмента Qt Designer создан макет диало­гового окна (рис. 3.8), которое необходимо использовать в каче­стве основного модального окна приложения.
314
3.3. Qt
Рис. 3.8. Редактирование файла пользовательского
интерфейса при помощи инструмента Qt Designer
Для удобства дальнейшей работы над проектом мож­но создать заголовочный файл с описанием класса окна (InputDialog). Таким образом, структура каталога проекта бу­дет такой, как на рис. 3.9.
Содержимое файла input_dialog.h:
#ifndef INPUT_DIALOG_H__
#define INPUT_DIALOG_H__
#include "ui_input_dialog.h"
#include <QDialog>
315
3. Примеры использования пакетов
hкаталог проектаi
ex-qt-uic.cpp ......................................... main()
input_dialog.cpp
input_dialog.h .........описание класса окна InputDialog
CMakeLists.txt
input_dialog.ui .................редактируется Qt Designer
Рис. 3.9. Структура каталога проекта с описанием
пользовательского интерфейса
class InputDialog :
public QDialog, public Ui::InputDialog
{
public:
//
InputDialog(QWidget *pParent = 0);
};
#endif // INPUT_DIALOG_H__
Здесь заголовочный файл ui_input_dialog.h генерирует­ся в каталоге построения инструментом uic на основе содержи­мого файла пользовательского интерфейса input_dialog.ui. В нём определён класс Ui::InputDialog, отвечающий за внеш­ний вид окна.
Файл input_dialog.cpp с реализацией конструкцией клас­са InputDialog:
#include "input_dialog.h"
316
3.3. Qt
InputDialog::InputDialog(QWidget *pParent)
: QDialog(pParent)
{
setupUi(this);
}
Здесь метод setupUi(), унаследованный от сгенерирован­ного класса Ui::InputDialog, исполняет весь код инициализа­ции окна.
Файл ex-qt-uic.cpp:
#include "input_dialog.h"
#include <QApplication>
int main(int nArgC, char *apszArgV[])
{
QApplication app(nArgC, apszArgV);
InputDialog dialog;
dialog.exec();
}
Файл CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.11)
project(ex-qt-uic)
317
3. Примеры использования пакетов
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(Qt5Widgets REQUIRED)
qt5_wrap_ui(
UI_WRAPPERS input_dialog.ui)
add_executable(
ex-qt-uic WIN32
ex-qt-uic.cpp input_dialog.cpp input_dialog.h
${UI_WRAPPERS})
target_link_libraries(
ex-qt-uic Qt5::Widgets)
Здесь значение истины присваивается специальной пере­менной CMake CMAKE_INCLUDE_CURRENT_DIR, чтобы каталог по­строения добавлялся в список путей для поиска заголовочных файлов. Это необходимо для того, чтобы директива #include, ко­торая подключает файл ui_input_dialog.h и которая использо­вана в файле input_dialog.h, сработала правильно. ∗
Замечание: в целях сокращения объёма примера в нём отсут- ствует код обработки событий пользовательского интерфейса на основе сигналов и слотов. В реальных проектах в клас­сах окон определяются слоты. Следовательно, эти классы так­же нужно передавать компилятору метаинформации при по­мощи команды qt5_wrap_cpp(), аналогично примеру на с. 305
(см. также следующий пример).
318
N
3.3. Qt
В качестве альтернативы приведённым выше командам qt5_...() можно присвоить значения истины специальным переменным CMAKE_AUTOMOC (доступна в CMake начиная с вер­сии 2.8.6), CMAKE_AUTORCC и CMAKE_AUTOUIC (доступны начи­ная с 3.0). Этими переменными инициализируются соответ­ствующие свойства целей, которые включают генерирование специальных правил построения, автоматически определяю­щих необходимость запуска инструментов для нужных фай­лов. Анализ исходных текстов учитывает директивы подклю-
чения заголовочных файлов с именами ui_....h и т. д. Под-
держиваются Qt версий 4 и 5. При использовании этих режи­мов упрощается описание проекта и добавление новых исход­ных файлов, однако несколько замедляется процесс построения. Для передачи инструментам moc и т. д. дополнительных клю­чей командной строки можно использовать специальные пере­менные CMAKE_AUTOMOC_MOC_OPTIONS, CMAKE_AUTORCC_OPTIONS и CMAKE_AUTOUIC_OPTIONS.
ПРИМЕР Пусть требуется добавить к предыдущему примеру (с. 314) об­работку событий ввода: реализовать для пользователя возмож­ность нажать кнопку «OK» только в том случае, если оба тексто­вых поля ввода заполнены непустыми значениями. Пусть так­же требуется добавить к диалоговому окну пиктограмму, ана­логично примеру на с. 310. Структура каталога проекта, таким образом, будет выглядеть так, как на рис. 3.10.
Файл input_dialog.h:
319
3. Примеры использования пакетов
hкаталог проектаi
resources
qt.ico
ex-qt-auto.cpp ........................................main()
input_dialog.cpp
input_dialog.h ........................обрабатывается moc
ex-qt-auto.qrc .........................обрабатывается rcc
CMakeLists.txt
input_dialog.ui ........................обрабатывается uic
Рис. 3.10. Структура каталога проекта с автоматическим
запуском инструментов Qt
#ifndef INPUT_DIALOG_H__
#define INPUT_DIALOG_H__
#include "ui_input_dialog.h"
#include <QDialog>
class InputDialog :
public QDialog, public Ui::InputDialog
{
Q_OBJECT
//
public:
//
InputDialog(QWidget *pParent = 0);
//
private slots:
320
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]