Есть пара вариантов, но все зависит от задачи.
1) Использовать готовые изображения для каждого состояния и описать в стилях. Например,
/*----------------------------------------------------------*/
QPushButton#buttonMoveUp{
background-image: url(:/style/images/upfocusnormal.png);
background-position: center;
border: none;
width: 30px;
height: 30px;
}
QPushButton#buttonMoveUp::hover {
background-image:url(:/style/images/upfocuspressed.png);
}
QPushButton#buttonMoveUp::pressed {
background-image:url(:/style/images/upfocuspressed.png);
}
QPushButton#buttonMoveUp::!enabled {
background-image:url(:/style/images/upnormal.png);
}
/*----------------------------------------------------------*/
2) Либо переопределять paintEvent и самому рисовать все что угодно. Состояние кнопки можно получить через QStyleOptionButton.
//---------------------------------------------------------------
void Button::paintEvent( QPaintEvent *ev )
{
QPainter painter(this);
QStyleOptionButton option;
initStyleOption(&option);
.....
}
//---------------------------------------------------------------
const QString Button::getIconSource( QStyleOption& option ) const
{
//draw icon
QString iconSource = getIconNormal();
//hover
if( option.state & QStyle::State_MouseOver)
{
iconSource = getIconHover();
}
//pressed
if( option.state & QStyle::State_Sunken )
{
iconSource = getIconPressed();
}
//checked
if( option.state & QStyle::State_On )
{
iconSource = getIconChecked();
}
//disabled
if( !(option.state & QStyle::State_Enabled) )
{
if( !getIconDisabled().isEmpty() )
{
iconSource = getIconDisabled();
}
}
return iconSource;
}
Вот ссылка на кастомную кнопку:
https://yadi.sk/d/fWC_VeDyeMu4o