becks
@becks

Как в Qt сделать QPushButton кастомной формы?

Форма любая, допустим, треугольник или стрелка.
Переопределял paintEvent, но почему-то теряются прочие свойства (подсветка при наведении мыши, углубление при нажатие и т.п.), выглядит как будто фигура нарисована на канве.
Делал setMask, но получается сильно "неалиаснутый" контур кнопки.
QML использовать нельзя. Желательно обойтись и без стилей.
  • Вопрос задан
  • 8138 просмотров
Пригласить эксперта
Ответы на вопрос 1
@danilevskiy
C++/Qt Developer
Есть пара вариантов, но все зависит от задачи.
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
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы