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
AD

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

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

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

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

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

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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