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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPushButton и background  (Прочитано 7098 раз)
PsM
Гость
« : Август 23, 2007, 10:32 »

Qt 4.3

наследую от QPushButton.
нужно менять цвет background-а и иконку в зависимости от
isChecked().

Как лучше делать ?
пробовал в paintEvent :
с иконкой все ок...
а вот бэкгроунд отрисовываеться только в состоянии Checked
вот код:
Код:
MyButton::MyButton( const QString & text, QWidget *parent)
    : QPushButton(text, parent)
{
    this->setCheckable(true);
    this->setAutoFillBackground(true);
}

void MyButton::paintEvent ( QPaintEvent * event )
{
    QBrush brush;
    if(this->isChecked() ) brush.setColor(QColor(255, 228, 159, 255));
    else brush.setColor(QColor(129, 114, 81, 255));

    QPalette palette;
    palette.setBrush(QPalette::Active, QPalette::Button, brush);
    palette.setBrush(QPalette::Inactive, QPalette::Button, brush);
    this->setPalette(palette);

    ...

    QPushButton::paintEvent(event);
}


И еще, в состоянии Checked цвет бакгроунда он использует не QPalette::Button  в чистом виде, а немного затемняет - это можно побороть ?

Записан
Emc
Гость
« Ответ #1 : Август 23, 2007, 12:55 »

кстати зачем ты в paintEvent полез - проше не писать новый класс, а повесить слот на сигнал clicked ( bool checked = false )
Код:
myPalette = pushButton->palette();
myPalette.setColor( pushButton->backgroundRole(), myColor );
pushButton->setPalette( myPalette );
« Последнее редактирование: Август 23, 2007, 13:05 от Emc » Записан
Mike
Гость
« Ответ #2 : Август 23, 2007, 13:09 »

кстати зачем ты в paintEvent полез - проше не писать новый класс, а повесить слот на сигнал clicked ( bool checked = false )
Код:
myPalette = pushButton->palette();
myPalette.setColor( pushButton->backgroundRole(), myColor );
pushButton->setPalette( myPalette );
Можно и так.
но если уж действительно нужно отнаследовать от QPushButton, то можно переписать virtual void checkStateSet (), а в ней
Код:
myPalette = palette();
myPalette.setColor( backgroundRole(), isChecked() ? myColor1 : myColor2 );
setPalette( myPalette );
Записан
PsM
Гость
« Ответ #3 : Август 23, 2007, 13:21 »

кстати зачем ты в paintEvent полез - проше не писать новый класс, а повесить слот на сигнал clicked ( bool checked = false )
Я наследую из других соображений -  нужен свой widget.

Код:
myPalette = pushButton->palette();
myPalette.setColor( pushButton->backgroundRole(), myColor );
pushButton->setPalette( myPalette );
Спасибо помогло...


и еще вопрос...
ссори, прошу если что не бить, я только осваиваю Qt...

почему у меня не получаеться сделать QIcon, ни статическим, ни обычным мембером моего виджета ?
(Program received signal SIGABRT (Aborted))

счас у меня
Код:
void MyButton::paintEvent ( QPaintEvent * event )
{
    ...
    setIcon(QIcon(...));
    ...
};
но это ОЧЕНЬ нехорошо ...
Как принято делать ?

Записан
Mike
Гость
« Ответ #4 : Август 23, 2007, 13:32 »

можно сделать так:
Код:
void MyButton::paintEvent ( QPaintEvent * event )
{
    static const QIcon icon(...);
    ...
    setIcon(icon);
    ...
};

или
Код:
// Файл MyButton.h
class MyButton : public QPushButton
{
public:
   static const QIcon icon;
   ....
}

// Файл MyButton.cpp
const QIcon MyButton::icon = QIcon(...);

а в paintEvent пользоваться icon
Записан
PsM
Гость
« Ответ #5 : Август 23, 2007, 14:21 »

Можно и так.
но если уж действительно нужно отнаследовать от QPushButton, то можно переписать virtual void checkStateSet (), а в ней
Только счас заметил про checkStateSet  Грустный ...
пропробовал -  checkStateSet - почемуто не вызываеться Грустный ...
Записан
Mike
Гость
« Ответ #6 : Август 23, 2007, 14:42 »

Да, действительно checkStateSet почему-то не вызывается.
Тогда можно через переопределение nextCheckState, я проверил - работает:

Код:
void MyButton::nextCheckState()
{
QPushButton::nextCheckState();

QPalette myPalette = palette();
myPalette.setColor( backgroundRole(), isChecked() ? color1 : color2 );
setPalette( myPalette );
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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