Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: PsM от Август 23, 2007, 10:32



Название: QPushButton и background
Отправлено: 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  в чистом виде, а немного затемняет - это можно побороть ?



Название: Re: QPushButton и background
Отправлено: Emc от Август 23, 2007, 12:55
кстати зачем ты в paintEvent полез - проше не писать новый класс, а повесить слот на сигнал clicked ( bool checked = false )
Код:
myPalette = pushButton->palette();
myPalette.setColor( pushButton->backgroundRole(), myColor );
pushButton->setPalette( myPalette );


Название: Re: QPushButton и background
Отправлено: Mike от Август 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 );


Название: Re: QPushButton и background
Отправлено: PsM от Август 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(...));
    ...
};
но это ОЧЕНЬ нехорошо ...
Как принято делать ?



Название: Re: QPushButton и background
Отправлено: Mike от Август 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


Название: Re: QPushButton и background
Отправлено: PsM от Август 23, 2007, 14:21
Можно и так.
но если уж действительно нужно отнаследовать от QPushButton, то можно переписать virtual void checkStateSet (), а в ней
Только счас заметил про checkStateSet  :( ...
пропробовал -  checkStateSet - почемуто не вызываеться :( ...


Название: Re: QPushButton и background
Отправлено: Mike от Август 23, 2007, 14:42
Да, действительно checkStateSet почему-то не вызывается.
Тогда можно через переопределение nextCheckState, я проверил - работает:

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

QPalette myPalette = palette();
myPalette.setColor( backgroundRole(), isChecked() ? color1 : color2 );
setPalette( myPalette );
}