Russian Qt Forum

Qt => QSS => Тема начата: yesrus от Март 19, 2009, 15:02



Название: pushbutton + stylesheet
Отправлено: 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 слотов - будет тормозить т.е. это кривой способ.
Заранее спасибо!


Название: Re: pushbutton + stylesheet
Отправлено: BRE от Март 19, 2009, 15:05
работает..но если там 100 кнопок...для каждой по 2 доп сигнала =+ 200 connect  и + 200 слотов - будет тормозить т.е. это кривой способ.
Заранее спасибо!
Ты один раз задай стиль для всего диалога, а в нем укажи как рисовать кнопки в разных состояниях. Какие connect'ы...  ;)


Название: Re: pushbutton + stylesheet
Отправлено: yesrus от Март 19, 2009, 15:10
Проблема в том, что кнопки разные..т.е. есть и обычные и такие.. + некоторые будут менять цвет фона по определенныем сигналам из программы.
+ т.к. я новичек в qt то не знаю как задать стить для всего диалога или всех кнопок..примерно представляю, что нужно наследоваться от пашбаттона и переопределить функции void custombutton::pressed {} и т.д., а как именно это сделать не знаю...здесь на форуме такой информации нет, на форуме тролей тоже, был бы очень признателен если бы кто-нибудь показал рабочий пример с 2-3 разными стилями кнопок.  ???

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

help me :(


Название: Re: pushbutton + stylesheet
Отправлено: Khs от Март 19, 2009, 15:11
можно глянуть: qt\examples\widgets\stylesheet


Название: Re: pushbutton + stylesheet
Отправлено: yesrus от Март 19, 2009, 15:20
Там ипользуются прямые ссылки и фиксированные названия кнопок поэтому не понятно как наследоваться от пашбаттона (ведь кнопок может быть очень много..и если посылать сигнал мигания на 100 кнопок это довольно много кода т.к. нужно указывать имена кнопок + куча таймеров в основном коде..все становится слишком громоздко), а если добавить доп функцию в кастом кнопку то смена цвета будет производиться при вызове всего 1 функции к примеру
Код:
ab1->blink(green);


Название: Re: pushbutton + stylesheet
Отправлено: BRE от Март 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, а имя класса-наследника.


Название: Re: pushbutton + stylesheet
Отправлено: yesrus от Март 19, 2009, 15:38
Спасибо, только не совсем понятно где описывать стиль (без использования дизайнера..т.е. случай когда кнопки создаются руками в коде)


Название: Re: pushbutton + stylesheet
Отправлено: BRE от Март 19, 2009, 16:30
Спасибо, только не совсем понятно где описывать стиль (без использования дизайнера..т.е. случай когда кнопки создаются руками в коде)
Можно написать стиль в отдельном файле, загружать текст из него и устанавливать.
А можно и весь этот текст оформит одной строкой и устанавливать.


Название: Re: pushbutton + stylesheet
Отправлено: yesrus от Март 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); (выбор цвета я в коде выше опустил для простоты...но это в итоге будет) ? Нужно ли в частях которые переписываются (к примеру конструктор) брать из исходников оригинальный текст и копипастить ?



Название: Re: pushbutton + stylesheet
Отправлено: BRE от Март 19, 2009, 17:33
Что писать вместо  "this.setStyleSheet"
this это указатель:
this->setStyleSheet(....)
или просто setStyleSheet(....)


Название: Re: pushbutton + stylesheet
Отправлено: yesrus от Март 19, 2009, 17:51
т.е. идея и реализация вообщем правильны ? Нужно ли переписывать код конструктора из исходников абстрактбаттона(т.к. я добавляю в него таймер)? Покажите пожалуйста рабочий код кастом кнопки (где все отличие в хотя бы 1 добавленной (пустой к примеру) функции и 1 измененной (хотя бы просто измененной добавлением коментария) стандартной.


Название: Re: pushbutton + stylesheet
Отправлено: BRE от Март 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 );
}
 


Название: Re: pushbutton + stylesheet
Отправлено: yesrus от Март 19, 2009, 19:10
Работает! :D
Теперь вопрос как переопределить слоты clicked\pressed и т.д. чтобы не использовать стили...


Название: Re: pushbutton + stylesheet
Отправлено: BRE от Март 19, 2009, 19:21
Работает! :D
Теперь вопрос как переопределить слоты clicked\pressed и т.д. чтобы не использовать стили...
Так тебе стили нужны были или мигающая кнопка?  :)


Название: Re: pushbutton + stylesheet
Отправлено: yesrus от Март 19, 2009, 19:51
По сигналам из программы нужно: менять цвет кнопки (2 варианта цвета) + включать мигание 3-м цветом. - точнее кнопка изначально плоская\синяя\с нестандартной границей, возможны варианты - зеленая(все остальное как и в синей), оранжевая (все остальное как и в синей), и мигающая желтая - при этом мигание происходит между стандартным синим и желтым цветом)

Кроме того не понятно как использовать стиль из основной программы (т.е. я считал файл со стилем ...и как из класса кнопки его использовать(в конструкторе кнопки)? не считывать же заново и не хранить эти настройки для каждой кнопки отдельно)