【问题标题】:Enable own widget for stylesheet为样式表启用自己的小部件
【发布时间】:2016-10-23 11:16:23
【问题描述】:

我想为样式表启用我自己的小部件类,我不是在谈论setStyleSheet(qss),而是在 qss 样式表中的选择器。据了解,我必须在命名空间中替换the "::" with "--"

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

a) 来自https://stackoverflow.com/a/8817908/356726 的覆盖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) 在同一个线程 (https://stackoverflow.com/a/22094319/356726) 中,据说我不需要覆盖 paintEvent。好的,引导我: b1) 无论如何覆盖paintEvent 是否有害,即使使用QFrame 也是如此? b2) 其他基类是什么,例如QTableView?是什么让QFrame 扮演了这个特殊的角色?

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

-- 编辑--

Daniel 指出了那个神奇的paintEvent sn-p hereQWidget 段落)的来源。有趣的是,QDialog 也有同样的说法(“仅支持 ..”),这可能意味着我也必须在那里使用 sn-p。我不明白他们为什么不按默认将那个 sn-p 添加到 QWidgetpaintEvent 中。

【问题讨论】:

  • a) doc.qt.io/qt-5/stylesheet-reference.html : "仅支持 background、background-clip 和 background-origin 属性。如果您从 QWidget 继承,您需要为您的自定义 QWidget 提供一个paintEvent,如下所示:" i认为它在 Qt5.6/5.7 中仍然有效
  • 谢谢,您已经找到了该代码 sn-p 的原始来源。以上更新。

标签: qt qwidget qtstylesheets qt5.6 qframe


【解决方案1】:

已发布的带有覆盖paintEvent 的方法是否仍然有效(Qt5.6/5.7)

  • 是的

据说在同一个线程 (https://stackoverflow.com/a/22094319/356726) 中,我不需要重写paintEvent。好的,引导我:b1) 无论如何覆盖paintEvent 是否有害,即使使用QFrame? b2)其他基类是什么,例如QTableView?是什么让 QFrame 扮演了这个特殊的角色?

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

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

  • Here are the official docs。 如果您向下滚动一点,它会显示:QWidget 仅支持背景, 背景剪辑和背景来源属性。如果你子类 来自QWidget,您需要为您的自定义提供一个paintEvent QWidget 如下:

-

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

【讨论】:

  • 知道为什么不将paintEventimplementation 设为QWidget 的默认值吗?
  • @HorstWalter 因为QWidget 是一个空小部件。
猜你喜欢
  • 2011-11-08
  • 2014-08-31
  • 2015-06-12
  • 2016-06-10
  • 2016-07-07
  • 2015-03-07
  • 2018-03-15
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多