Qt 自定义PushButton qss不生效的问题处理

如果你的按钮类是从QPushButton继承而来,发现对它设置Qss不生效。
尝试了一下网上的方法,后来直接去看了一些QPushButton中的paintEvent函数中到底做了什么,就知道怎么解决了。

解决方法:

  1. 加上Q_OBJECT
  2. 重写void paintEvent(QPaintEvent *event)
void 你的PushButton::paintEvent(QPaintEvent *event)
{
    QPushButton::paintEvent(event);
    ...
}

这样你定义的按钮就可以用Qss设置样式了,问题解决了。

如果有兴趣,可以看看QPushButton::paintEvent(event)做了些什么事情。
我的Qt安装目录在D盘:
D:\Qt\Qt5.14.1\5.14.1\Src\qtbase\src\widgets\widgets\qpushbutton.cpp

void QPushButton::paintEvent(QPaintEvent *)
{
    QStylePainter p(this);
    QStyleOptionButton option;
    initStyleOption(&option);
    p.drawControl(QStyle::CE_PushButton, option);
}
/*!
    Initialize \a option with the values from this QPushButton. This method is useful
    for subclasses when they need a QStyleOptionButton, but don't want to fill
    in all the information themselves.

    \sa QStyleOption::initFrom()
*/
void QPushButton::initStyleOption(QStyleOptionButton *option) const
{
    if (!option)
        return;

    Q_D(const QPushButton);
    option->initFrom(this);
    option->features = QStyleOptionButton::None;
    if (d->flat)
        option->features |= QStyleOptionButton::Flat;
#if QT_CONFIG(menu)
    if (d->menu)
        option->features |= QStyleOptionButton::HasMenu;
#endif
    if (autoDefault())
        option->features |= QStyleOptionButton::AutoDefaultButton;
    if (d->defaultButton)
        option->features |= QStyleOptionButton::DefaultButton;
    if (d->down || d->menuOpen)
        option->state |= QStyle::State_Sunken;
    if (d->checked)
        option->state |= QStyle::State_On;
    if (!d->flat && !d->down)
        option->state |= QStyle::State_Raised;
    option->text = d->text;
    option->icon = d->icon;
    option->iconSize = iconSize();
}

参考:
QT 自定义控件 为自定义控件设置QSS无效

自定义WIDGET使用QSS失效问题解决方法

你可能感兴趣的:(QT)