Qt 如何从QWidget';s paintEvent()

Qt 如何从QWidget';s paintEvent(),qt,Qt,有没有办法获取QWidget上显示的像素,进行一些处理,然后显示处理后的像素 我似乎无法克服paintEvent()的局限性,希望有人能帮助我 QPixmap::grabWidget和QWidget::render将获得所需的像素,但不能从paintEvent()中调用它们,因为这样做将触发无限循环 我尝试过运行计时器、拍摄快照、进行处理、强制重新绘制以及显示保存的图像。这在某种程度上是可行的,但在动态内容(即移动)上,它失败得很惨 我需要能够从paintEvent()中执行此操作 有什么方法可

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

我似乎无法克服paintEvent()的局限性,希望有人能帮助我

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

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

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


有什么方法可以做到这一点吗?

听起来您的问题最好是通过将小部件渲染到一个pixmap(在绘制事件中),在pixmap上进行处理,然后将结果渲染到小部件来解决:

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
幕后的形式。但是,在本例中,在执行最终渲染之前,您正在对图形进行一些处理。因此,这可能是最好的方法。

听起来您的问题最好的解决方法是将小部件渲染到一个pixmap(在绘制事件中),在pixmap上进行处理,然后将结果渲染到小部件:

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
幕后的形式。但是,在本例中,在执行最终渲染之前,您正在对图形进行一些处理。因此,这可能是最好的方法。

谢谢。这是非常接近我需要的。但是,我不想在这里绘制小部件的内容,只想用我的图像处理算法修改它。实际上,我正在使用一个子类QDeclarativeView来呈现QML内容,但我需要在它进入屏幕之前立即对其进行后过滤。看起来我可以在第一个painter.begin(&pixmap)…painter.end()块中执行render(),这将完全满足我的需要。再次感谢!谢谢这是非常接近我需要的。但是,我不想在这里绘制小部件的内容,只想用我的图像处理算法修改它。实际上,我正在使用一个子类QDeclarativeView来呈现QML内容,但我需要在它进入屏幕之前立即对其进行后过滤。看起来我可以在第一个painter.begin(&pixmap)…painter.end()块中执行render(),这将完全满足我的需要。再次感谢!