【问题标题】:update() or repaint() fails to trigger paintEvent()update() 或 repaint() 无法触发paintEvent()
【发布时间】:2010-02-16 16:38:17
【问题描述】:

我有一个 QScrollArea 继承了我很棒的滚动小部件。我喜欢在各种场合更新内容。

为此,我重写了paintEvent(QPaintEvent *)。然后每次我想要完成时,我都会在小部件上调用update()

问题: paintEvent() 永远不会被这个调用!

到目前为止我在故障排除方面的尝试:

  • 使用repaint() 而不是update()。应该立即调用它。不幸的是没有。
  • 测试isVisible()updatesEnabled
  • 测试我的覆盖是否正确。 调整窗口大小调用我的函数。只有我的手动 update()、repaint() 调用失败。
  • 实现一个 QTimer 以每 500 毫秒触发一次 update() 或 repaint()。触发器给出文本输出,函数没有被调用。

有人知道接下来要检查什么吗?什么可以让 repaint() 调用paintEvent()?

【问题讨论】:

  • 不是在 QScrollArea 上绘图,而是它分配的 QLabel 为我解决了这个问题。我得到了 QLabel 的 update()s。
  • 你能粘贴你的标题/类定义吗?你有所有的 Q_OBJECT 宏吗?还可以快速了解您如何覆盖您的paintEvent()...

标签: qt4 repaint


【解决方案1】:

解决方案是从您的QAbstractScrollArea 派生类调用this->viewport()->repaint()this->viewport()->update(),而不仅仅是repaint()update()

更多信息在Qt documentation:

QWidget * QAbstractScrollArea::viewport () const

返回视口小部件。 使用QScrollArea::widget() 函数检索视口小部件的内容。

由于我们在QAbstractScrollArea 派生类中的内容将显示在视口小部件中,因此调用视口小部件的更新或重绘以再次绘制我们的数据是有意义的(调用我们的paintEvent)。

【讨论】:

  • 基本上这是正确的答案。我的错是我从 QScrollArea 创建了我的自定义小部件,并认为我可以在那里进行个人绘图。相反,我将不得不覆盖视口的绘图功能,这可能是不可能的。
  • 可以覆盖视口的绘图功能。在视口的重新实现的paintEvent() 中,您唯一需要注意的是- 传递this->viewport(),而不是像通常在创建QPainter 对象时那样传递“this”指针。 QPainter(this->viewport()) 而不是 QPainter(this)。否则会抛出“QPainter is not active”错误。
  • 这适用于任何使用 QAbstractScrollArea 的“花式”小部件,例如 QTableWidget。非常感谢您指出这一点!
  • 在同一问题上花了三个小时。感谢发帖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
相关资源
最近更新 更多