Qt4 update()或repaint()未能触发paintEvent()

Qt4 update()或repaint()未能触发paintEvent(),qt4,repaint,Qt4,Repaint,我有一个QScrollArea的父亲我的可怕的滚动小部件。我喜欢在各种场合更新内容 为此,我重写了paintEvent(QPaintEvent*)。然后每次我想要完成它时,我都在小部件上调用update() 问题:paintEvent() 到目前为止,我在故障排除方面所做的尝试: 使用repaint()而不是update()。应该立即调用它。不幸的是,事实并非如此 测试isVisible()和updateEnabled 测试我的超控是否正确调整窗口大小将调用my函数。只有my manual u

我有一个QScrollArea的父亲我的可怕的滚动小部件。我喜欢在各种场合更新内容

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

问题:
paintEvent()

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

  • 使用
    repaint()
    而不是
    update()
    。应该立即调用它。不幸的是,事实并非如此
  • 测试
    isVisible()
    updateEnabled
  • 测试我的超控是否正确调整窗口大小将调用my函数。只有my manual update()、repaint()调用失败
  • 实现一个QTimer,每500毫秒触发一次update()或repaint()。触发器提供文本输出,不调用该函数

有人知道下一步要检查什么吗?什么可以使repaint()不调用paintEvent()?

解决方案是从
QAbstractScrollArea
派生类调用
this->viewport()->repaint()
this->viewport()->update()

更多信息见:

QWidget*QAbstractScrollArea::viewport()const

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


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

没有在QScrollarArea上绘制,而是它指定的QLabel为我解决了问题。我得到了QLabel的update()s。您能粘贴到头/类定义中吗?你有所有的Q_对象宏吗?同时给出一个关于如何覆盖paintEvent()的快速片段……基本上这是正确的答案。我的错误是,我从QScrollArea创建了我的自定义小部件,并认为我可以在那里单独绘制。相反,我必须覆盖视口的绘图功能,这可能是不可能的。可以覆盖视口的绘图功能。在viewport的重新实现的paintEvent()中,您需要注意的唯一一件事是传递“this”指针,而不是像创建QPaint对象时通常所做的那样,传递this->viewport()。QPaint(此->视口())而不是QPaint(此)。否则会抛出“QPaint未激活”错误。这适用于任何使用QAbstractScrollArea的“fancy”小部件,如QTableWidget。非常感谢你指出这一点!在这个问题上花了三个小时。谢谢你的发帖。