Как изменить цвет кнопки qt creator

Поменять цвет у кнопки C++ Qt Решение и ответ на вопрос 2972540

L1R1KA

0 / 0 / 0

Регистрация: 19.04.2022

Сообщений: 4

1

Поменять цвет у кнопки

19.04.2022, 13:58. Показов 2304. Ответов 6

Метки c++ 1 курс, qt creator (Все метки)


Здравствуйте. Я начинающий программист(студент). Прошу помочь. Мне дали доп задание, ломаю голову как его сделать. звучит так: Должна быть кнопка(button) , которая будет менять цвет. 4 нажатиия — 4 цвета(красный, зелёный , жёлтый , синий) и так будет повторяться в той же последовательности, до 16 нажатий, после чего программа закроется.
Вот что пока что смог написать — просто меняет 2 цвета…:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow:: MainWindow(QWidget * parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
MainWindow:: ~MainWindow()
{
delete ui;
}
   void MainWindow:: on_pushButton_clicked()
{
   QPushButton *button =static_cast<QPushButton*>(sender());
{
{
  
if (state == 0)
{ 
button -> setStyleSheet("background-color:red");
button -> SetProperty("currentState", 1)
}
else
{
button -> setStyleSheet("background-color:green");
button -> SetProperty("currentState", 0);
}
 
 
 
}
 
 
}}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Алексей1153

фрилансер

4488 / 3997 / 872

Регистрация: 11.10.2019

Сообщений: 10,526

19.04.2022, 14:55

2

L1R1KA,

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
MainWindow:: MainWindow(QWidget * parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    connect(ui->pushButton,&QAbstractButton::clicked,this,[this]
    {
        const static QColor list[]={"#ff0000","#00ff00","#ffff00","#00ff00"};
        static size_t index=0;
        ui->pushButton->setStyleSheet("background-color:"+list[index].name());
        index=(index+1)%std::size(list);
    });
}



1



kapbepucm

1332 / 591 / 287

Регистрация: 02.05.2020

Сообщений: 1,418

20.04.2022, 13:38

3

дополню код Алексей1153:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MainWindow:: MainWindow(QWidget * parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    connect(ui->pushButton,&QAbstractButton::clicked,this,[this]
    {
        static int count=0;
        ++count;
        if (count>15)
          qApp->quit();
 
        const static QColor list[]={"#ff0000","#00ff00","#ffff00","#00ff00"};
        static size_t index=0;
        ui->pushButton->setStyleSheet("background-color:"+list[index].name());
        index=(index+1)%std::size(list);
    });
}



1



фрилансер

4488 / 3997 / 872

Регистрация: 11.10.2019

Сообщений: 10,526

20.04.2022, 13:56

4

kapbepucm, ага, я ТЗ не дочитал )



0



0 / 0 / 0

Регистрация: 19.04.2022

Сообщений: 4

20.04.2022, 16:11

 [ТС]

5

А есть возможность объяснить что тут написано или более проще написать, более тапорно что-ли?(для новичков)



0



1332 / 591 / 287

Регистрация: 02.05.2020

Сообщений: 1,418

20.04.2022, 16:53

6

Всё, что находится внутри [this]{ ........ } можете поместить в ваш void MainWindow::on_pushButton_clicked()

Инициализация переменных, где встречаете вначале static, выполняется только при первом вызове (клике), потом эти строки мысленно можете опускать

Добавлено через 3 минуты
создаётся список из нескольких цветов, и при каждом клике считывается из него следующий элемент, если достигли предела, то за следующего считаем первый



1



Ender Che

323 / 232 / 50

Регистрация: 29.05.2018

Сообщений: 666

20.04.2022, 18:52

7

widget.h
======

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <QWidget>
#include <QPushButton>
 
class Widget : public QWidget
{
    Q_OBJECT
 
public:
    Widget(QWidget *parent = 0);
    ~Widget();
 
private:
    int count;
    int colorCount;
    QStringList listColor;
    QPushButton* button;
 
private slots:
    void clickButton();
};

widget.cpp
========

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "widget.h"
#include <QPushButton>
#include <QVBoxLayout>
#include <QApplication>
 
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    count = 0;
    colorCount = 0;
    listColor << "#ff0000" << "#00ff00" << "#ffff00" << "#00ff00";
 
    button = new QPushButton("Button");
    button->setStyleSheet("background-color:" + listColor.at(colorCount));
    QVBoxLayout* layout = new QVBoxLayout;
    layout->addWidget(button);
    setLayout(layout);
 
    connect(button, &QPushButton::clicked, this, &Widget::clickButton);
}
 
Widget::~Widget()
{
 
}
 
void Widget::clickButton()
{
    ++count;
    if(count > 15)
        qApp->quit();
 
    ++colorCount;
    if(colorCount > 3)
        colorCount = 0;
 
    button->setStyleSheet("background-color:" + listColor.at(colorCount));
}



0



Я хочу изменить цвет кнопки в QT после нажатия кнопки. Проблема в том, что когда у меня несколько кнопок, все цвета кнопки меняются. Как я могу сделать только тот, который я нажал на Изменить? PS: я новичок, поэтому было бы очень хорошо, если бы вы могли объяснить свое решение в деталях, sry: D.

2 ответа

Короткий ответ: ваша QSS неверна для ваших целей, QPushButton — это стиль для всего класса QPushButton (и его предков) , поэтому текущий результат. Используйте #yourButtonName , и это будет работать.

Код и пояснения:

Получить имя кнопки в слоте можно через sender() , но использовать ее так же, как вы делаете сейчас, было бы немного уродливо, посмотрите сами:

Примечание: connect используется вместо созданного дизайнером слота, а sender() используется, так что вы можете повторно использовать этот слот для других кнопок.

Ну, иногда вам захочется написать меньше кода, генерирующего стили, потому что он быстро становится нечитаемым, а затем динамические свойства становятся полезными:

Таким образом вы заставляете виджет «запоминать» какое-то состояние в свойстве, более аккуратным способом, ИМХО. Кроме того, этот небольшой взлом с QStyle становится обязательным. Сам стиль для нажатых кнопок может быть добавлен только один раз в таблицу стилей MainWindow (я сделал это в Qt Designer, вы также можете сделать это в конструкторе):

Как я могу сделать только тот, который я нажал на Изменить? Вы устанавливаете свойство для экземпляра кнопки затем:

Кроссплатформенное приложение на Qt: Таблицы стилей

Сегодня я хотел бы рассмотреть вопрос кастомизации интерфейса программ на Qt. Основным вариантом является использование Qt Style Sheets. Как становится очевидно из названия, это немного специфичный аналог привычных всем каскадных таблиц стилей (CSS2), без которых немыслим современный интернет. QSS чаще всего применяются для двух вещей: либо доточить какой-нибудь виджет до более родного вида, либо наоборот, сделать интерфейс более нарядным, выделяющимся, возможно одинаковым на всех платформах.

  • Сегментные кнопки
  • Обычные кнопки
  • Таблицы
  • Скроллбары
Основы

Итак, создаем файл стилей, применяем его глобально к приложению:

Есть отличный перевод официальной документации по синтаксису таблиц стилей, так что замечу лишь, что чаще других используется три способа описания виджетов, к которым будет применен стиль (селекторы):

Обращение по классу, например такое правило будет применено ко всем кнопкам вашего приложения, цвет фона будет изменен на красный:

Обращение по имени, тогда это правило будет применено только к тем кнопкам, которые имеют имя «okButton»:
Причем если на одной и той же форме есть несколько элементов, к которым нужно применить одинаковый стиль, можно воспользоваться методом setObjectName:
Обращение по иерархии виджетов на форме, тогда правило будет применено только к тем кнопкам, которые лежат внутри рамки с именем «mainFrame»:

Отдельно нужно сказать о задании стилей для подэлементов и псевдо-состояний:

Псевдо-состояния указываются в конце селектора, отделяются двоеточием (:). Например, следующее правило применяется, когда мышь находится над QPushButton:

Сложные виджеты содержат в себе подэлементы, потому для изменения оформления можно получить доступ к каждому из них, для этого используется оператор «::». Например, мы хотим изменить/убрать стрелочку, показывающую, что кнопке назначено меню, в таком случае правило будет выглядеть следующим образом:

К сожалению, чтобы описать все возможности потребуется полнокровный учебник по CSS, потому переходим к примерам.

Кнопки сегментные

У меня две новости: одна хорошая, а другая не очень. Печаль в том, что QSS не поддерживает отрисовку теней. Совсем. Потому если сделать обычное состояние сегментных кнопок в общем-то не сложно, то нажатое… в общем только картинки.
Вот стили, ответственные за это безобразие:

Состояние :pressed нужно указывать для того, чтобы не было лага при его прохождении.

Кнопки обыкновенные

Мне известны только два варианта отображения нажатого состояния без использования теней — отразить градиент и обратить цвета. Рассмотрим второй вариант:

Таблицы

Кастомизация таблиц сделана весьма добротно, отдельно задаются стили для шапки, отдельно для самой таблицы. Есть возможность задать стили для определенных колонок (секций) шапки через подэлемент ::section. Для этого реализованы псевдо-состояния :first, :last, :only-one, :next-selected, :previous-selected, :selected, :horizontal, :vertical и :checked.

Скроллбары

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

Как изменить цвет кнопки qt c

Нужно переопределить QPushButton::paintEvent, что там у него в нутрях вертиться а?

Добавлено 02.12.09, 15:27
Суть в том что QPushButton::paintEvent Перерисовывает кнопку + задает ей серый цвет. а мне нужен другой.

для не нажатой кнопки background-color:

pushButton->setStyleSheet(QString::fromUtf8(«background-color: rgb(244, 115, 255);»));

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    !
    Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+

    • При создании темы ОБЯЗАТЕЛЬНО указывайте версию тулкита / библиотеки / компилятора.
    • Перед тем как задать вопрос, сформулируйте его правильно, чтобы вас могли понять.
    • Нарушение Правил может повлечь наказание со стороны модераторов.

    Полезные ссылки:
    user posted image Boost по-русски
    user posted image Qt по-русски

    >
    Как сменить цвет кнопки в QT?

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему



    Сообщ.
    #1

    ,
    02.12.09, 08:41

      Сабж.
      Зарание спасибо.


      Radagast



      Сообщ.
      #2

      ,
      02.12.09, 09:19

        QWidget::setStylesheet


        Painkiller



        Сообщ.
        #3

        ,
        02.12.09, 09:51

          В 3 тьем QT такого нету… мне просто нужно изменить цвет нажатой кнопки…


          Painkiller



          Сообщ.
          #4

          ,
          02.12.09, 14:52

            Нужно переопределить QPushButton::paintEvent, что там у него в нутрях вертиться а?

            Добавлено 02.12.09, 15:27
            Суть в том что QPushButton::paintEvent Перерисовывает кнопку + задает ей серый цвет… а мне нужен другой…


            miksayer



            Сообщ.
            #5

            ,
            02.12.09, 17:24

              Цитата Painkiller @ 02.12.09, 09:51

              В 3 тьем QT такого нету

              а в чем смысл использовать такую древность? кстати, вчера вышла Qt 4.6


              _lcf_



              Сообщ.
              #6

              ,
              02.12.09, 17:31

                для не нажатой кнопки background-color:

                pushButton->setStyleSheet(QString::fromUtf8(«background-color: rgb(244, 115, 255);»));

                для нажатой ничего нет…


                miksayer



                Сообщ.
                #7

                ,
                02.12.09, 19:24

                  _lcf_, дык 3й Кют еще не поддерживает таблицы стилей


                  Radagast



                  Сообщ.
                  #8

                  ,
                  02.12.09, 21:04

                    Painkiller
                    откройте исходники и посмотрите, если так интересно, что внутри QPushButton::paintEvent.


                    Painkiller



                    Сообщ.
                    #9

                    ,
                    03.12.09, 09:11

                      Так он же вроде не OpenSource больше… не? А старых исходников у меня нету… :(


                      Painkiller



                      Сообщ.
                      #10

                      ,
                      03.12.09, 10:42

                        Вопрос решен, всем спасибо.


                        miksayer



                        Сообщ.
                        #11

                        ,
                        04.12.09, 13:59

                          Цитата Painkiller @ 03.12.09, 09:11

                          Вопрос решен, всем спасибо.

                          а решение выложить не хочешь?

                          Цитата Painkiller @ 03.12.09, 09:11

                          Так он же вроде не OpenSource больше…

                          Кют ? еще как опен-сорс, просто есть коммерческая и опен-сорс версии


                          Painkiller



                          Сообщ.
                          #12

                          ,
                          11.12.09, 14:23

                            ExpandedWrap disabled

                              if( down == true )

                              {

                              QPalette Palette( «brown» );

                              this->setPalette( Palette );

                              }else

                              {

                              QPalette Palette( «gray» );

                              this->setPalette( Palette );

                              };

                            — Это в переопределенном PainEvent( )


                            Radagast



                            Сообщ.
                            #13

                            ,
                            11.12.09, 20:35

                              Painkiller
                              разве setPalette не провоцирует перерисовку? боюсь, у Вас тут получается бесконечный цикл событий :unsure:


                              Painkiller



                              Сообщ.
                              #14

                              ,
                              12.12.09, 17:43

                                Разве? Спасибо, завтра гляну…


                                _lcf_



                                Сообщ.
                                #15

                                ,
                                12.12.09, 17:50

                                  Цитата Radagast @ 11.12.09, 20:35

                                  разве setPalette не провоцирует перерисовку?

                                  :no:

                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                  0 пользователей:

                                  • Предыдущая тема
                                  • Кроссплатформенный C/C++: cl/gcc/Qt/Gtk+/WxWidgets
                                  • Следующая тема

                                  Рейтинг@Mail.ru

                                  [ Script execution time: 0,0350 ]   [ 16 queries used ]   [ Generated: 12.02.23, 20:55 GMT ]  

                                  Понравилась статья? Поделить с друзьями:
                                • Как изменить цвет интерфейса adobe after effects
                                • Как изменить фон input css
                                • Как изменить фон grub
                                • Как изменить фон google meet
                                • Как изменить фон always on display