为样式表启用自己的小部件
Enable own widget for stylesheet
我想为样式表启用我自己的小部件 class,我 不是 谈论 setStyleSheet(qss)
,而是 qss 样式表中的选择器。据了解,我必须替换名称空间中的the "::" with "--"。
在这里 ( Qt Stylesheet for custom widget ) 我发现了一个类似的问题,但它已经超过 4 年了。根据回答我有一些详细的问题:
a) 已发布的具有覆盖 paintEvent
的方法是否仍然有效 (Qt5.6/5.7),来自
void CustomWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
b) 据说在同一个线程 () 中,我不需要覆盖 paintEvent
。好的,引导我:
b1) 无论如何覆盖 paintEvent
是否有害,即使使用 QFrame
?
b2) 其他基数 classes 是什么,例如QTableView
?是什么让 QFrame
担任这个特殊角色?
c) 有没有人找到关于该主题的官方 Qt 文档。不错的代码,但是它是从哪里来的? (here)老实说,我不明白它的作用。
-- 编辑--
Daniel 指出了那个神奇的 paintEvent
片段 here(QWidget
段落)的来源。有趣的是,QDialog
也是如此 ("supports only .."),这可能意味着我也必须在那里使用该代码段。我不明白为什么他们不默认将该代码段添加到 QWidget
的 paintEvent
。
已发布的覆盖 paintEvent 的方法是否仍然有效 (Qt5.6/5.7)
- 是
据说在同一个线程()中,我不需要覆盖 paintEvent。好的,引导我:b1) 覆盖 paintEvent 是否有害,即使使用 QFrame? b2) 其他基数 类 是什么,例如QTableView?是什么让 QFrame 具有这种特殊的作用?
- 如果你继承
QFrame
, it provides its own paint event. QFrame
is not a special case, it applies to all widgets. The default QWidget::paintEvent
什么都不做。它是空的。这就是为什么您必须覆盖它并提供您自己的绘画以在子类化时启用样式表 QWidget
。覆盖 QFrame
的绘制事件没有害处,但除非调用 QFrame
的实现,否则您将失去默认行为。
有没有人找到关于该主题的官方 Qt 文档。不错的代码,但是它来自哪里?
- 这里是官方
文档。
如果向下滚动一点,它会显示:
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);
}
我想为样式表启用我自己的小部件 class,我 不是 谈论 setStyleSheet(qss)
,而是 qss 样式表中的选择器。据了解,我必须替换名称空间中的the "::" with "--"。
在这里 ( Qt Stylesheet for custom widget ) 我发现了一个类似的问题,但它已经超过 4 年了。根据回答我有一些详细的问题:
a) 已发布的具有覆盖 paintEvent
的方法是否仍然有效 (Qt5.6/5.7),来自
void CustomWidget::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
b) 据说在同一个线程 () 中,我不需要覆盖 paintEvent
。好的,引导我:
b1) 无论如何覆盖 paintEvent
是否有害,即使使用 QFrame
?
b2) 其他基数 classes 是什么,例如QTableView
?是什么让 QFrame
担任这个特殊角色?
c) 有没有人找到关于该主题的官方 Qt 文档。不错的代码,但是它是从哪里来的? (here)老实说,我不明白它的作用。
-- 编辑--
Daniel 指出了那个神奇的 paintEvent
片段 here(QWidget
段落)的来源。有趣的是,QDialog
也是如此 ("supports only .."),这可能意味着我也必须在那里使用该代码段。我不明白为什么他们不默认将该代码段添加到 QWidget
的 paintEvent
。
已发布的覆盖 paintEvent 的方法是否仍然有效 (Qt5.6/5.7)
- 是
据说在同一个线程()中,我不需要覆盖 paintEvent。好的,引导我:b1) 覆盖 paintEvent 是否有害,即使使用 QFrame? b2) 其他基数 类 是什么,例如QTableView?是什么让 QFrame 具有这种特殊的作用?
- 如果你继承
QFrame
, it provides its own paint event.QFrame
is not a special case, it applies to all widgets. The defaultQWidget::paintEvent
什么都不做。它是空的。这就是为什么您必须覆盖它并提供您自己的绘画以在子类化时启用样式表QWidget
。覆盖QFrame
的绘制事件没有害处,但除非调用QFrame
的实现,否则您将失去默认行为。
有没有人找到关于该主题的官方 Qt 文档。不错的代码,但是它来自哪里?
- 这里是官方
文档。
如果向下滚动一点,它会显示:
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);
}