1

有什么方法可以获取将在 QWidget 上显示的像素,进行一些处理,然后显示处理后的像素?

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

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

我尝试过运行计时器、拍摄快照、进行处理、强制重绘并显示保存的图像。这在某种程度上有效,但在动态内容(即移动)上它失败了。

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

有没有办法做到这一点?

4

1 回答 1

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 提供了双缓冲。但是,在您的情况下,您正在执行最终渲染之前对绘图进行一些处理。因此,这可能是最好的方法。

于 2012-10-24T23:03:00.580 回答