我想为样式表启用自己的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
代码段here(QWidget
段落)的来源。有趣的是({em>"仅支持.." )对QDialog
说,这可能意味着我也必须在那里使用代码段。我无法理解为什么他们不会默认将该代码段添加到paintEvent
QWidget
。
答案 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 event。 QFrame
不是特例,它适用于所有小部件。默认QWidget::paintEvent
不执行任何操作。它是空的。这就是为什么你必须覆盖它并提供自己的绘画来在子类化QWidget
时启用样式表。覆盖QFrame
的绘制事件无害,但除非您调用QFrame
实现,否则将失去默认行为。有没有人找到关于该主题的官方Qt文档。 a中的代码很好,但它来自哪里?
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);
}