Evgenii Legotckoi
Қар. 9, 2019, 1:42 Т.Қ.

QML - 037-сабақ. QML-де түймелерді теңшеу (002 сабақты жаңарту)

По просьбе одного из пользователей обновляю один из первых уроков в соответствии с текущим состоянием Qt. А именно новый урок будет написан с использованием Qt Quick Controls 2.

А именно, настраиваем внешний вид нашего приложения, чтобы кнопки выглядели следующим образом.


Вступление

Первая кнопка будет красной с черным ободком и черным текстом, а при нажатии она изменит цвет фона на черный с красным ободком и красным. А вторая кнопка будет иметь те же цвета, но в обратной последовательности.

Версии

  • Qt 5.13
  • Qt Quick Controls 2

Структура проекта

Не буду вникать в содержимое файла pro, так как он создается по умолчанию. А вот все остальные файлы мы изучим.

main.cpp

Могу сказать, что содержимое шаблонов файла main.cpp претерпело значительные изменения. И теперь созданный файл по умолчанию выглядит следующим образом.

  1. #include <QGuiApplication>
  2. #include <QQmlApplicationEngine>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6. QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
  7.  
  8. QGuiApplication app(argc, argv);
  9.  
  10. QQmlApplicationEngine engine;
  11. const QUrl url(QStringLiteral("qrc:/main.qml"));
  12. QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
  13. &app, [url](QObject *obj, const QUrl &objUrl) {
  14. if (!obj && url == objUrl)
  15. QCoreApplication::exit(-1);
  16. }, Qt::QueuedConnection);
  17. engine.load(url);
  18.  
  19. return app.exec();
  20. }
  21.  

main.qml

Теперь создайте и настройте наши кнопки.

  1. import QtQuick 2.12
  2. import QtQuick.Window 2.12
  3. import QtQuick.Controls 2.12
  4.  
  5. Window {
  6. visible: true
  7. width: 640
  8. height: 480
  9. title: qsTr("Custom Button")
  10.  
  11. // Create the first button
  12. Button {
  13. id: button_1 // Будем
  14. // Customize layout using anchors
  15. anchors.verticalCenter: parent.verticalCenter
  16. anchors.right: parent.horizontalCenter
  17. anchors.rightMargin: 15
  18. text: qsTr("Press me 1")
  19.  
  20. // To customize the text, you need to set the Text object to contentItem
  21. contentItem: Text {
  22. text: button_1.text
  23. color: button_1.pressed ? "black" : "red"
  24. }
  25.  
  26. // To customize the background, you must override the background property
  27.         // namely, install some object that inherits from Item
  28.         // For example Rectangle
  29. background: Rectangle {
  30. // The important point for dynamically setting the color is
  31.             // that we control the pressed property of the button we are interested in
  32.             // and depending on its state, set the color
  33. color: button_1.pressed ? "red" : "black" // as background color
  34. border.color: button_1.pressed ? "black" : "red" // so the borders
  35. border.width: 2
  36. radius: 5
  37. }
  38. }
  39.  
  40. // Similarly, we customize the second button
  41. Button {
  42. id: button_2
  43. anchors.verticalCenter: parent.verticalCenter
  44. anchors.left: parent.horizontalCenter
  45. anchors.leftMargin: 15
  46. text: qsTr("Press me 2")
  47.  
  48. contentItem: Text {
  49. text: button_2.text
  50. color: button_2.pressed ? "red" : "black"
  51. }
  52.  
  53. background: Rectangle {
  54. color: button_2.pressed ? "black" : "red"
  55. border.color: button_2.pressed ? "red" : "black"
  56. border.width: 2
  57. radius: 5
  58. }
  59. }
  60. }
  61.  

Вывод

Если вы сравните предыдущую статью, то увидите, что разница в сложности кода очевидна. Лично я считаю благом то, что теперь не нужно переопределять стили объектов для кастомизации, как это было в Qt Quick Controls 1. Это был уродливый и не гибкий API для кастомизации. А в некоторых случаях приходилось исправлять приватную часть кода, что тоже очень плохо. Если вам нужно исправить приватную часть кода, то это говорит о двух вещах:

  • или ошибки, которые можно исправить внесением в код библиотеки, и это нормально
  • или плохая архитектура, что гораздо хуже

Также это будет первая статья, код которой будет размещен в общем специальном репозитории. Дальнейшие статьи постараюсь выкладывать в репозиторий на GitHub, чтобы все было в одном месте.

GitHub репозиторийі

Осы тақырып бойынша ұсынылатын мақалалар

Мақала бойынша сұралады0сұрақтар(лар)

1

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз