BlinCT
BlinCT27 квітня 2020 р. 04:14

Кастомный баттон qml со своими стилями

Всем привет.
Появилась необходимость сделать свою qml кнопку, то есть расширить стандартную из 2 контролов.
Например нужно в оформлении кнопки сделать декорацию вертикальную или горизонтальную.
Если горизонтальная то сверху и снизу на кнопке прочерчиваем 2 прямые на растоянии от границы кнопки например 7 пикселей, и внутри этой декорации меняем цвет например на белый если нажали на кнопку.
Буду очень признателен если кто то накинет примерно код такой кнопки.
Изменение в стиле придется делать много, а исходя из этого я хоть разберу как это работает. Особенно в дизайне.
Спасибо.

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

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

5
BlinCT
  • 27 квітня 2020 р. 14:47
  • Відповідь була позначена як рішення.

Вопрос закрыт, нашел пример в инете)

    Evgenii Legotckoi
    • 28 квітня 2020 р. 02:52

    Скинул бы тогда хоть пример кода сюда, а то как обычно

      R
      • 30 квітня 2020 р. 03:56

      якщо потрібно просто кнопку то можна створити файли MyButton.qml з кодом і використовувати як зазвичай

      import QtQuick 2.7
      import QtQuick.Controls 1.4
      import QtQuick.Layouts 1.3
      import QtQuick.Controls.Styles 1.4
      
      Button {
      
          id: but
          property string text;
          property alias checkable: but.checkable
          property bool visibleBackground: true
          style: ButtonStyle {
              background:  Item {
                  Rectangle {
                      anchors.fill: parent
                      anchors.bottomMargin: control.pressed ? 0 : -1
                      color: "#10000000"
                      //radius: baserect.radius
                  }
                  Rectangle {
                      id: baserect
                      gradient: Gradient {
                          GradientStop {color: control.pressed ? styleUser.value("ButtonGradientColor2") : styleUser.value("ButtonGradientColor1") ; position: 0}
                          GradientStop {color: control.pressed ? styleUser.value("ButtonGradientColor1") : styleUser.value("ButtonGradientColor2") ; position: control.pressed ? 0.1: 1}
                      }
                      radius: 0
                      visible: but.visibleBackground
                      anchors.fill: parent
                      border.color: control.activeFocus ? styleUser.value("ButtonBorderColor") : styleUser.value("ButtonBorderActiveFocusColor")
                      Rectangle {
                          anchors.fill: parent
                          //radius: parent.radius
                          color: control.activeFocus ? "#47b" : styleUser.value("ButtonActiveFocus")
                          opacity: control.hovered || control.activeFocus ? 0.1 : 0
                          Behavior on opacity {NumberAnimation{ duration: 100 }}
                      }
                      Rectangle {
                          anchors.fill: parent
                          color: "#d4d4d4"
                          opacity: control.enabled ? 0 : 0.3
      
                      }
                  }
                  Image {
                      id: imageItem
                      visible: control.menu !== null
                      source: styleUser.urlStyle() + "arrow-down.png"
                      anchors.verticalCenter: parent.verticalCenter
                      anchors.right: parent.right
                      anchors.rightMargin: padding.right
                      opacity: control.enabled ? 0.6 : 0.5
                  }
              }
              label: Text {
                  text: but.text
                  horizontalAlignment: Text.AlignHCenter
                  verticalAlignment: Text.AlignVCenter
                  color: styleUser.value("ButtonTextColor")
              }
      
      
          }
      }
      
        R
        • 30 квітня 2020 р. 04:37

        і другий варіант це через власний стиль
        одразу коротке пояснення в файлах вказано значення типу styleUser.value("ButtonActiveFocus") це тому що в нас дані стилю беруться з файлу і просто не хотілось переписувати, так як код з проекту взятий

        для цього потрідно в main.cpp додати

            QQuickStyle::setStyle(":/MyStyle");
            QQuickStyle::setFallbackStyle("Default");
        

        створити файл qtquickcontrols2.conf

        [Controls]
        Style=MyStyle
        
        [Material]
        Primary=#41cd52
        Accent=#41cd52
        Theme=System
        

        далі в папці потрібно створити папку MyStyle
        в які будуть файли стилю на різні компоненти в тому числі і Button.qml (можна взяти їх перекопіювати з базових стилів)

        import QtQuick 2.12
        import QtQuick.Controls 2.12
        import QtQuick.Controls.impl 2.12
        import QtQuick.Templates 2.12 as T
        
        T.Button {
            id: control
        
            contentItem: Label {
                text: control.text
                horizontalAlignment: Text.AlignHCenter
                verticalAlignment: Text.AlignVCenter
                color: styleUser.value("ButtonTextColor")
            }
        
            background:  Item {
                Rectangle {
                    anchors.fill: parent
                    anchors.bottomMargin: control.pressed ? 0 : -1
                    color: "#10000000"
                    //radius: baserect.radius
                }
                Rectangle {
                    id: baserect
                    gradient: Gradient {
                        GradientStop {color: control.pressed ? styleUser.value("ButtonGradientColor2") : styleUser.value("ButtonGradientColor1") ; position: 0}
                        GradientStop {color: control.pressed ? styleUser.value("ButtonGradientColor1") : styleUser.value("ButtonGradientColor2") ; position: control.pressed ? 0.1: 1}
                    }
                    radius: 0
                    anchors.fill: parent
                    border.color: control.activeFocus ? styleUser.value("ButtonBorderColor") : styleUser.value("ButtonBorderActiveFocusColor")
                    Rectangle {
                        anchors.fill: parent
                        //radius: parent.radius
                        color: control.activeFocus ? "#47b" : styleUser.value("ButtonActiveFocus")
                        opacity: control.hovered || control.activeFocus ? 0.1 : 0
                        Behavior on opacity {NumberAnimation{ duration: 100 }}
                    }
                    Rectangle {
                        anchors.fill: parent
                        //radius: parent.radius
                        //color: control.enabled ? "#47b" : styleUser.value("ButtonActiveFocus")
                        color: "#d4d4d4"
                        opacity: control.enabled ? 0 : 0.3
                       // Behavior on opacity {NumberAnimation{ duration: 100 }}
                    }
                }
            }
        }
        
        
          BlinCT
          • 30 квітня 2020 р. 04:53

          Сорян, забыл кинуть то что примерно хотел получить в реализации

          Button
          {
              id: control
              text: qsTr("Button")
          
              property string label: ""
              property alias rectWidth: rectSize.implicitWidth
              property alias rectHeight: rectSize.implicitHeight
          
              contentItem: Text {
                  text: control.label
                  font: control.font
                  opacity: enabled ? 1.0 : 0.3
                  color: control.down ? "#FA8072" : "#000000"
                  horizontalAlignment: Text.AlignHCenter
                  verticalAlignment: Text.AlignVCenter
                  elide: Text.ElideRight
              }
          
              background: Rectangle {
                  id: rectSize
                  implicitWidth: 100
                  implicitHeight: 96
          //        opacity: enabled ? 1 : 0.3
          //        anchors.fill: parent
                  color: "#666666"
          //        border.color: control.down ? "#FA8072" : "#696969"
                  border.width: 1
          //        radius: 4
              }
          
              Rectangle
              {
                  id: rectUp
          
                  anchors.top: parent.top
                  anchors.left: parent.left
                  anchors.right: parent.right
          
                  height: 10
          
                  color: "#101010"
              }
          
              Rectangle
              {
                  id: rectDown
          
                  anchors.bottom: parent.bottom
                  anchors.left: parent.left
                  anchors.right: parent.right
          
                  height: 10
          
                  color: "#222222"
              }
          }
          

            Коментарі

            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,>…

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