0

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

在这里(自定义小部件的 Qt 样式表)我发现了一个类似的问题,但它已经超过 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 文档。很好的代码,但它来自哪里?在这里)老实说,我不明白它的作用。

- 编辑 -

丹尼尔在这里指出了那个神奇paintEvent片段的来源(段落)。有趣的是,同样的(“仅支持 ..”)被说成 for ,这可能意味着我也必须在那里使用该片段。我不明白为什么他们不默认将该片段添加到of中。QWidgetQDialogpaintEventQWidget

4

1 回答 1

3

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

  • 是的

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

  • 如果您进行子类化QFrame,它会提供自己的绘制事件QFrame不是特例,它适用于所有小部件。默认值QWidget::paintEvent什么都不做。它是空的。这就是为什么您必须重写它并提供自己的绘画以在子类化时启用样式表QWidget。覆盖 的绘制事件并无害,但除非调用s 实现QFrame,否则您将失去默认行为。QFrame

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

  • 这是官方文档。如果您向下滚动一点,它会显示:QWidget 仅支持背景、背景剪辑和背景来源属性。如果您从 QWidget 继承,您需要为您的自定义 QWidget 提供一个paintEvent,如下所示:

-

void CustomWidget::paintEvent(QPaintEvent *)    
{
    QStyleOption opt;
    opt.init(this);
    QPainter p(this);
    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
于 2016-06-22T08:32:00.340 回答