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
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:84бали,
  • Рейтинг балів4
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:42бали,
  • Рейтинг балів-8
ОК

Qt - Тест 001. Сигналы и слоты

  • Результат:47бали,
  • Рейтинг балів-6
Останні коментарі
ИМ
Игорь Максимов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 аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Дмитрий
Дмитрий03 лютого 2025 р. 06:24
Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
NW
Nayo Wai30 січня 2025 р. 09:22
не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
n
nkly03 січня 2025 р. 02:52
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
M
Marsel16 серпня 2023 р. 14:26
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.

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