【问题标题】:What to paint in the paintEvent implementation?在paintEvent 实现中绘制什么?
【发布时间】:2015-10-28 16:06:43
【问题描述】:

Qt 的文档说:

许多小部件在被要求时可以简单地重新绘制其整个表面,但一些慢速小部件需要通过仅绘制请求的区域来优化:QPaintEvent::region()。这种速度优化不会改变结果,因为在事件处理期间绘画被剪裁到该区域。例如,QListView 和 QTableView 就是这样做的。

这是否意味着当我编写一个QWidget的paintEvent函数时,不需要手动编写控件的哪个部分应该被绘制的代码,而这一切都由qt自己自动处理?

【问题讨论】:

    标签: qt


    【解决方案1】:

    当我编写 QWidget 的paintEvent 函数时,无需手动编写关于应该绘制小部件的哪个部分的代码 [?]

    没错。传递给您的画家已经被剪辑到您的小部件的矩形中,因此您不能在小部件之外进行绘画。如果你的绘画很便宜,那么你当然可以一次重绘整个小部件,而忽略在绘画事件中传递的重绘矩形或区域。

    您也不应该盲目地假设只绘制小部件的一部分会以某种方式固有地更快。你必须测量这个!

    能否详细解释一下paintevent的传播方向,通常qt的事件是作为child->parent传播的,但是paintevent有什么不同吗?

    所有需要绘制的小部件都已绘制。该事件不被传播,它在小部件合成器的指导下直接传递给相关小部件。

    [...] 当调用子部件的paintEvent 时,它也会调用其父部件的paintEvent。这是为什么呢?

    恰好绘制了两个单独的小部件。仅仅因为他们恰好是父母和孩子并没有多大意义。每个小部件都单独关心其绘制事件。小部件合成器(后备存储)具有全局性。如果父项在子项被绘制之前似乎无缘无故被绘制,那么子项很可能不是不透明的,父项被绘制以便子项可以在其上合成。设置Qt::WA_OpaquePaintEvent 如果您的paintEvent 进行不透明绘画并且通过绘画的内容看不到父级的任何部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 2014-05-10
      • 1970-01-01
      相关资源
      最近更新 更多