为样式表

时间:2016-06-21 18:49:56

标签: qt qwidget qtstylesheets qt5.6 qframe

我想为样式表启用自己的widget类,我在中讨论setStyleSheet(qss),而在qss样式表中选择器。据我所知,我必须在命名空间中替换the "::" with "--"

这里(Qt Stylesheet for custom widget)我发现了一个类似的问题,但它是> 4岁。基于答案,我有一些详细的问题:

a)已发布的方法是否已覆盖paintEvent仍然有效(Qt5.6 / 5.7),来自https://stackoverflow.com/a/8817908/356726

void CustomWidget::paintEvent(QPaintEvent *)
 {
     QStyleOption opt;
     opt.init(this);
     QPainter p(this);
     style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
 }

b)在同一个帖子(https://stackoverflow.com/a/22094319/356726)中,我不需要覆盖paintEvent。好的,带我到: b1)无论如何,即使使用paintEvent,覆盖QFrame也是有害的吗? b2)与其他基类有什么关系,例如QTableView?是什么让QFrame具有这个特殊角色?

c)有人找到关于该主题的官方Qt文档。 a中的代码很好,但它来自哪里?here)老实说,我不明白它的作用。

- 编辑 -

丹尼尔已经指出了该神奇的paintEvent代码段hereQWidget段落)的来源。有趣的是({em>"仅支持.." )对QDialog说,这可能意味着我也必须在那里使用代码段。我无法理解为什么他们不会默认将该代码段添加到paintEvent QWidget

1 个答案:

答案 0 :(得分:3)

使用重写的paintEvent发布的方法是否仍然有效(Qt5.6 / 5.7)

在同一个线程(https://stackoverflow.com/a/22094319/356726)中,我不需要覆盖paintEvent。好吧,引导我:b1)无论如何,即使使用QFrame,覆盖paintEvent也是有害的吗? b2)与其他基类有什么关系,例如QTableView中?是什么让QFrame具有这个特定的角色?

  • 如果您继承QFrame, it provides its own paint eventQFrame不是特例,它适用于所有小部件。默认QWidget::paintEvent不执行任何操作。它是空的。这就是为什么你必须覆盖它并提供自己的绘画来在子类化QWidget时启用样式表。覆盖QFrame的绘制事件无害,但除非您调用QFrame实现,否则将失去默认行为。

有没有人找到关于该主题的官方Qt文档。 a中的代码很好,但它来自哪里?

  • Here are the official docs。 如果向下滚动一点,它会指出:QWidget 仅支持背景, background-clip和background-origin属性。如果你是子类 从QWidget,您需要为您的自定义提供paintEvent QWidget如下:

-

void CustomWidget::paintEvent(QPaintEvent *)    
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}