如何从QWidget的paintEvent()中获取帧缓冲区

时间:2012-10-24 22:16:48

标签: qt

有没有办法获取将在QWidget上显示的像素,进行一些处理,然后显示已处理的像素?

我似乎无法克服paintEvent()的限制,希望有人可以提供帮助。

QPixmap :: grabWidget和QWidget :: render会得到我需要的像素,但是不能从paintEvent()中调用它们,因为这样做会触发无限循环。

我尝试过运行计时器,拍摄快照,进行处理,强制重新绘制以及显示保存的图像。这在某种程度上起作用,但是对于动态内容(即移动),它会失败。

我需要能够在paintEvent()中执行此操作。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

听起来你的问题最好通过将小部件渲染到像素图(在绘图事件中),在像素图上进行处理,然后将结果渲染到小部件来解决:

void MySuperAwesomeWidget::paintEvent(QPaintEvent* event)
{
   QPixmap pixmap(size());
   QPainter painter;

   painter.begin(&pixmap);
   // Drawing code goes here
   painter.end();

   // Do processing on pixmap here

   painter.begin(this);
   painter.drawPixmap(0, 0, pixmap);
   painter.end();
}

通常,我所描述的技术被认为是不必要的(甚至是不合需要的),因为它本质上是一种双缓冲形式,并且在幕后是QWidget already provides double-buffering。但是,在您执行最终渲染之前,您正在对绘图进行一些处理。因此,这可能是最好的方法。