Evgenii Legotckoi
Evgenii Legotckoi09 листопада 2019 р. 02:42

QML - Урок 037. Кастомізація кнопок в QML (Оновлення уроку 002)

На прохання одного з користувачів обновляю один з перших уроків відповідно до актуальним станом 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")

    // Створюємо першу кнопку
    Button {
        id: button_1
        // Налаштовуємо верстку за допомогою якорів
        anchors.verticalCenter: parent.verticalCenter
        anchors.right: parent.horizontalCenter
        anchors.rightMargin: 15
        text: qsTr("Press me 1")

        // Для кастомізації тексту потрібно встановити об'єкт Text в contentItem
        contentItem: Text {
            text: button_1.text
            color: button_1.pressed ? "black" : "red"
        }

        // Для кастомізації фону необхідно перевизначити властивість background
        // а саме встановити в нього який-небудь об'єкт, який успадкований від Item
        // Наприклад Rectangle
        background: Rectangle {
            // Важливим моментом для динамічної установки кольору полягає в тому,
            // що ми контролюємо властивість pressed у цікавій для нас кнопки
            // і в залежності від його стану встановлюємо колір
            color: button_1.pressed ? "red" : "black"           // як колір фону
            border.color: button_1.pressed ? "black" : "red"    // так і кордони
            border.width: 2
            radius: 5
        }
    }

    // Аналогічно робимо кастомізацію другої кнопки
    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 для кастомізації. А в деяких випадках доводилося виправляти private частина коду, що теж дуже погано. Якщо доводиться виправляти private частина коду, то це говорить про дві речі:

  • або про помилки, що можна виправити за допомогою контрібьюціі в код бібліотеки, і це нормально
  • Або про поганий архітектурі, що вже набагато гірше

Також, це буде перша стаття, код якої буде викладений в загальному спеціальному сховищі. Постараюся подальші статті також укладати в репозиторій на GitHub, що все було в одному місці.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
d
  • dsfs
  • 26 квітня 2024 р. 11:56

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
d
  • dsfs
  • 26 квітня 2024 р. 11:45

C++ - Тест 002. Константы

  • Результат:50бали,
  • Рейтинг балів-4
d
  • dsfs
  • 26 квітня 2024 р. 11:35

C++ - Тест 001. Первая программа и типы данных

  • Результат:73бали,
  • Рейтинг балів1
Останні коментарі
k
kmssr09 лютого 2024 р. 02:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 09:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 грудня 2023 р. 18:30
Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 грудня 2023 р. 16:38
Boost - статичне зв&#39;язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 грудня 2023 р. 05:01
Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi02 травня 2024 р. 21:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderChe30 квітня 2024 р. 11:22
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…
G
Gar22 квітня 2024 р. 12:46
Clipboard Как скопировать окно целиком в clipb?
Павел Дорофеев
Павел Дорофеев14 квітня 2024 р. 09:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex04 квітня 2024 р. 11:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

Слідкуйте за нами в соціальних мережах