- 1. Вступление
- 2. Версии
- 3. Структура проекта
- 4. main.cpp
- 5. main.qml
- 6. Вывод
По просьбе одного из пользователей обновляю один из первых уроков в соответствии с текущим состоянием Qt. А именно новый урок будет написан с использованием Qt Quick Controls 2.
А именно, настраиваем внешний вид нашего приложения, чтобы кнопки выглядели следующим образом.
Вступление
Первая кнопка будет красной с черным ободком и черным текстом, а при нажатии она изменит цвет фона на черный с красным ободком и красным. А вторая кнопка будет иметь те же цвета, но в обратной последовательности.
Версии
- Qt 5.13
- Qt Quick Controls 2
Структура проекта
Не буду вникать в содержимое файла pro, так как он создается по умолчанию. А вот все остальные файлы мы изучим.
main.cpp
Могу сказать, что содержимое шаблонов файла main.cpp претерпело значительные изменения. И теперь созданный файл по умолчанию выглядит следующим образом.
#include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QQmlApplicationEngine engine; const QUrl url(QStringLiteral("qrc:/main.qml")); 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(); }
main.qml
Теперь создайте и настройте наши кнопки.
import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Controls 2.12 Window { visible: true width: 640 height: 480 title: qsTr("Custom Button") // Create the first button Button { id: button_1 // Будем // Customize layout using anchors anchors.verticalCenter: parent.verticalCenter anchors.right: parent.horizontalCenter anchors.rightMargin: 15 text: qsTr("Press me 1") // To customize the text, you need to set the Text object to contentItem contentItem: Text { text: button_1.text color: button_1.pressed ? "black" : "red" } // To customize the background, you must override the background property // namely, install some object that inherits from Item // For example Rectangle background: Rectangle { // The important point for dynamically setting the color is // that we control the pressed property of the button we are interested in // and depending on its state, set the color color: button_1.pressed ? "red" : "black" // as background color border.color: button_1.pressed ? "black" : "red" // so the borders border.width: 2 radius: 5 } } // Similarly, we customize the second button Button { id: button_2 anchors.verticalCenter: parent.verticalCenter anchors.left: parent.horizontalCenter anchors.leftMargin: 15 text: qsTr("Press me 2") contentItem: Text { text: button_2.text color: button_2.pressed ? "red" : "black" } background: Rectangle { color: button_2.pressed ? "black" : "red" border.color: button_2.pressed ? "red" : "black" border.width: 2 radius: 5 } } }
Вывод
Если вы сравните предыдущую статью, то увидите, что разница в сложности кода очевидна. Лично я считаю благом то, что теперь не нужно переопределять стили объектов для кастомизации, как это было в Qt Quick Controls 1. Это был уродливый и не гибкий API для кастомизации. А в некоторых случаях приходилось исправлять приватную часть кода, что тоже очень плохо. Если вам нужно исправить приватную часть кода, то это говорит о двух вещах:
- или ошибки, которые можно исправить внесением в код библиотеки, и это нормально
- или плохая архитектура, что гораздо хуже
Также это будет первая статья, код которой будет размещен в общем специальном репозитории. Дальнейшие статьи постараюсь выкладывать в репозиторий на GitHub, чтобы все было в одном месте.