Russian Qt Forum
Июнь 16, 2024, 02:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: pushbutton + stylesheet  (Прочитано 18787 раз)
yesrus
Гость
« : Март 19, 2009, 15:02 »

Подскажите пожалуйста как изменить стиль для разных состояний кнопок, к примеру по мануалу
Цитировать
The only issue remaining is that the button doesn't react when we press it. We can fix this by specifying a slightly different background color and use a different border style.
 QPushButton#evilButton {
     background-color: red;
     border-style: outset;
     border-width: 2px;
     border-radius: 10px;
     border-color: beige;
     font: bold 14px;
     min-width: 10em;
     padding: 6px;
 }
 QPushButton#evilButton:pressed {
     background-color: rgb(224, 0, 0);
     border-style: inset;
 }

У меня есть кнопки в приложении которые создаются так:
test.h
Код:
QPushButton *ab1;
test.cpp
Код:
ab1 = new QPushButton(tr("TestButton"), this);

Как для этих кнопок переопределить pressed стиль как сказанно в мануале ?
Пробовал делать это по сигналу (через слот) -
Код:
ab1->setStyleSheet("background-color: rgb(224, 0, 0);   border-style: inset;");
работает..но если там 100 кнопок...для каждой по 2 доп сигнала =+ 200 connect  и + 200 слотов - будет тормозить т.е. это кривой способ.
Заранее спасибо!
Записан
BRE
Гость
« Ответ #1 : Март 19, 2009, 15:05 »

работает..но если там 100 кнопок...для каждой по 2 доп сигнала =+ 200 connect  и + 200 слотов - будет тормозить т.е. это кривой способ.
Заранее спасибо!
Ты один раз задай стиль для всего диалога, а в нем укажи как рисовать кнопки в разных состояниях. Какие connect'ы...  Подмигивающий
Записан
yesrus
Гость
« Ответ #2 : Март 19, 2009, 15:10 »

Проблема в том, что кнопки разные..т.е. есть и обычные и такие.. + некоторые будут менять цвет фона по определенныем сигналам из программы.
+ т.к. я новичек в qt то не знаю как задать стить для всего диалога или всех кнопок..примерно представляю, что нужно наследоваться от пашбаттона и переопределить функции void custombutton::pressed {} и т.д., а как именно это сделать не знаю...здесь на форуме такой информации нет, на форуме тролей тоже, был бы очень признателен если бы кто-нибудь показал рабочий пример с 2-3 разными стилями кнопок.  Непонимающий

п.с. это бы кстати пригодилось и в другом вопросе-мигание кнопки...опять же как я понимаю нужно наследоваться от пашбаттона и добавить функцию смены цвета-по вызову из программы к примеру
Код:
ab1->blink(green);
А в самом коде blink с помощью таймера менялся бы цвет сначала на зеленый, потом с пом. 2-го таймера назад на стандартный, и так пока не прийдет сигнал к примеру
Код:
ab1->stopblink();

help me Грустный
« Последнее редактирование: Март 19, 2009, 15:14 от yesrus » Записан
Khs
Гость
« Ответ #3 : Март 19, 2009, 15:11 »

можно глянуть: qt\examples\widgets\stylesheet
Записан
yesrus
Гость
« Ответ #4 : Март 19, 2009, 15:20 »

Там ипользуются прямые ссылки и фиксированные названия кнопок поэтому не понятно как наследоваться от пашбаттона (ведь кнопок может быть очень много..и если посылать сигнал мигания на 100 кнопок это довольно много кода т.к. нужно указывать имена кнопок + куча таймеров в основном коде..все становится слишком громоздко), а если добавить доп функцию в кастом кнопку то смена цвета будет производиться при вызове всего 1 функции к примеру
Код:
ab1->blink(green);
Записан
BRE
Гость
« Ответ #5 : Март 19, 2009, 15:22 »

Код
C++ (Qt)
TestDialog::TestDialog()
{
   QPushButton *btn1_1 = new QPushButton( this );
   btn1_1->setObjectName( "Type 1" );
   QPushButton *btn1_2 = new QPushButton( this );
   btn1_2->setObjectName( "Type 1" );
   QPushButton *btn1_3 = new QPushButton( this );
   btn1_3->setObjectName( "Type 1" );
 
   QPushButton *btn2_1 = new QPushButton( this );
   btn2_1->setObjectName( "Type 2" );
   QPushButton *btn2_2 = new QPushButton( this );
   btn2_2->setObjectName( "Type 2" );
   QPushButton *btn2_3 = new QPushButton( this );
   btn2_3->setObjectName( "Type 2" );
}
 
Имя объекта будет означать тип. Дальше в стилях:
Код:
QPushButton#Type1 {
     background-color: red;
     border-style: outset;
     border-width: 2px;
     border-radius: 10px;
     border-color: beige;
     font: bold 14px;
     min-width: 10em;
     padding: 6px;
 }
 QPushButton#Type1:pressed {
     background-color: rgb(224, 0, 0);
     border-style: inset;
 }

QPushButton#Type2 {
     background-color: green;
     border-style: outset;
     border-width: 2px;
     border-radius: 10px;
     border-color: beige;
     font: bold 14px;
     min-width: 10em;
     padding: 6px;
 }
 QPushButton#Type2:pressed {
     background-color: rgb(224, 0, 0);
     border-style: inset;
 }
И этот стиль установить для объекта диалога TestDialog.

P.S. Сам именно такой способ не использовал (не проверял), попробуй.

Также можно сделать несколько классов-наследников от QPushButton и в стилях для каждого класса писать не QPushButton#Type2, а имя класса-наследника.
« Последнее редактирование: Март 19, 2009, 15:26 от BRE » Записан
yesrus
Гость
« Ответ #6 : Март 19, 2009, 15:38 »

Спасибо, только не совсем понятно где описывать стиль (без использования дизайнера..т.е. случай когда кнопки создаются руками в коде)
Записан
BRE
Гость
« Ответ #7 : Март 19, 2009, 16:30 »

Спасибо, только не совсем понятно где описывать стиль (без использования дизайнера..т.е. случай когда кнопки создаются руками в коде)
Можно написать стиль в отдельном файле, загружать текст из него и устанавливать.
А можно и весь этот текст оформит одной строкой и устанавливать.
Записан
yesrus
Гость
« Ответ #8 : Март 19, 2009, 17:06 »

Понятно, спасибо.
Остался один вопрос - как наследоваться от абстрактбаттона и добавить функцию мигания (саму функцию понятно как реализовать-с помощью style sheet менять цвет, а вот как это описать..)?

т.е. наследуемся и просто пишем

Цитировать
class custombutton : public QAbstractButton
{
   Q_OBJECT
 
public:
   custombutton(QWidget* parent = 0);

private:
     void startblink(QString color);
     void stoptblink();
     int status;
     QTimer *timer;
     
private slots:
     void blink(QString color);
...

В конструкторе -
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(blink()));
Далее...

void custombutton::startblink(QString color) {
status=1;
blink(color);
}

void custombutton::stopblink() {
status=0;
}

void custombutton::blink(QString color) {
if (status == 1) then {
     if (blink == 1){
       this.setStyleSheet("color: red"); } ---------------------что вместо этого текста ?
       blink =0;
       timer->start(200);
     } else {
               this.setStyleSheet(" border: 4px solid silver; color: green"); ---------------------что вместо этого текста ?
               blink = 1;
               timer->start(200);
              }
}

Как нечто подобное написать в кастомкнопке которая наследуется ? Что писать вместо  "this.setStyleSheet", чтобы менялся цвет кнопки для которой пришел вызов типа ab1->blink(green); (выбор цвета я в коде выше опустил для простоты...но это в итоге будет) ? Нужно ли в частях которые переписываются (к примеру конструктор) брать из исходников оригинальный текст и копипастить ?

« Последнее редактирование: Март 19, 2009, 17:10 от yesrus » Записан
BRE
Гость
« Ответ #9 : Март 19, 2009, 17:33 »

Что писать вместо  "this.setStyleSheet"
this это указатель:
this->setStyleSheet(....)
или просто setStyleSheet(....)
Записан
yesrus
Гость
« Ответ #10 : Март 19, 2009, 17:51 »

т.е. идея и реализация вообщем правильны ? Нужно ли переписывать код конструктора из исходников абстрактбаттона(т.к. я добавляю в него таймер)? Покажите пожалуйста рабочий код кастом кнопки (где все отличие в хотя бы 1 добавленной (пустой к примеру) функции и 1 измененной (хотя бы просто измененной добавлением коментария) стандартной.
« Последнее редактирование: Март 19, 2009, 17:53 от yesrus » Записан
BRE
Гость
« Ответ #11 : Март 19, 2009, 18:03 »

т.е. идея и реализация вообщем правильны ? Нужно ли переписывать код конструктора из исходников абстрактбаттона(т.к. я добавляю в него таймер)? Покажите пожалуйста рабочий код кастом кнопки (где все отличие в хотя бы 1 добавленной (пустой к примеру) функции и 1 измененной (хотя бы просто измененной добавлением коментария) стандартной.
Я не знаю как будет работать стили после отключения мигания, попробую.
Код
C++ (Qt)
class MyButton : public QPushButton
{
   Q_OBJECT
public:
   MyButton( QWidget *parent = 0 );
 
private:
   QTimer *m_timer;
};
 
MyButton::MyButton( QWidget *parent = 0 )
   : QPushButton( parent )
{
   m_timer = new QTimer( this );
}
 
Записан
yesrus
Гость
« Ответ #12 : Март 19, 2009, 19:10 »

Работает! Веселый
Теперь вопрос как переопределить слоты clicked\pressed и т.д. чтобы не использовать стили...
Записан
BRE
Гость
« Ответ #13 : Март 19, 2009, 19:21 »

Работает! Веселый
Теперь вопрос как переопределить слоты clicked\pressed и т.д. чтобы не использовать стили...
Так тебе стили нужны были или мигающая кнопка?  Улыбающийся
Записан
yesrus
Гость
« Ответ #14 : Март 19, 2009, 19:51 »

По сигналам из программы нужно: менять цвет кнопки (2 варианта цвета) + включать мигание 3-м цветом. - точнее кнопка изначально плоская\синяя\с нестандартной границей, возможны варианты - зеленая(все остальное как и в синей), оранжевая (все остальное как и в синей), и мигающая желтая - при этом мигание происходит между стандартным синим и желтым цветом)

Кроме того не понятно как использовать стиль из основной программы (т.е. я считал файл со стилем ...и как из класса кнопки его использовать(в конструкторе кнопки)? не считывать же заново и не хранить эти настройки для каждой кнопки отдельно)
« Последнее редактирование: Март 19, 2009, 20:01 от yesrus » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.192 секунд. Запросов: 20.