从QAbstractButton继承的类中的样式表

时间:2019-03-30 11:21:36

标签: qt

我创建了从QAbstractButton继承的类,样式表在该类中不起作用。 如何在继承自QAbstractButton的类中使用样式表?

MyButton::MyButton(QWidget *parent):
    QAbstractButton(parent)
{
    setGeometry(0, 0, 100, 50);
    setText(tr("My button"));
    setStyleSheet("QAbstractButton:hover{background-color:blue}");
}

void MyButton::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.fillRect(rect(), QColor("black"));
    painter.fillRect(rect().x() + 2, rect().y() + 2,
                     rect().width() - 4, rect().height() - 4,
                     QColor("red"));
    painter.drawText(rect(), Qt::AlignCenter, text());
}

1 个答案:

答案 0 :(得分:1)

嗨,欢迎来到这里!

一旦重写paintEvent方法,您将对小部件的绘制方式承担全部责任。因此,样式表将不起作用,因为不会涉及您的应用程序使用的QStyle。

如果只需要一个在鼠标悬停于其上时会改变颜色的按钮,则根本不需要派生QAbstractButton类。只需使用标准的QPushButton并相应地设置其样式即可。

否则,如果要完全控制并自己绘画,可以使用 enterEvent() leaveEvent()轻松实现悬停效果功能。只需在您的课程中添加一个布尔值(即“ isHover”),然后编写如下内容:

MyButton::MyButton(QWidget *parent):
    QAbstractButton(parent)
{
    isHover = false;
    setGeometry(0, 0, 100, 50);
    setText(tr("My button"));
}

void MyButton::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.fillRect(rect(), (isHover ? Qt::blue : Qt::red));
    painter.fillRect(rect().x() + 2, rect().y() + 2,
                     rect().width() - 4, rect().height() - 4,
                     QColor("red"));
    painter.drawText(rect(), Qt::AlignCenter, text());
}

void MyButton::enterEvent(QEvent *event)
{
    isHover = true;
}

void MyButton::leaveEvent(QEvent *event)
{
    isHover = false;
}