为样式表启用自己的小部件

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 片段 hereQWidget 段落)的来源。有趣的是,QDialog 也是如此 ("supports only .."),这可能意味着我也必须在那里使用该代码段。我不明白为什么他们不默认将该代码段添加到 QWidgetpaintEvent

已发布的覆盖 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);
}