每次需要重新绘制时,如何在像素图中抓取 qwidget/render?

psy*_*khi 4 qt

我有一个不想在屏幕上显示的 QWidget。相反,我想在每次重新绘制小部件时获取它的像素图,以便将其发送到我正在处理的应用程序的另一部分。API 提供了两种方法:QPixmap::grabWidgetQWidget::render

问题是这两种方法都会触发一个新paintEvent的小部件,创建小部件的递归重绘,所以它们不应该在paintEvent方法中使用。

那么我怎么能在每次重新绘制小部件时获得一个代表小部件的像素图呢?

Dmi*_*nov 5

作为另一种方式 - 你可以做下一个检查:

void paintEvent(QPaintEvent*)
{
  QPainter painter(this);
  // If painter redirection was turned on, the painter will *not* paint on `this`!
  // Painting code
  //...
  if ( this == qobject_cast< QWidget * >( painter.device() ) )
  {
    // Do grabbing
  }
}
Run Code Online (Sandbox Code Playgroud)

为在小部件上绘画和抓取时调用paintEvent。仅当当前绘画在小部件上时painter->device(),将不返回空值,而是返回QWidget *对象的实例。在绘制的情况下QPixmap- 它会返回QPixmap *。所以只有在真正的widget上进行绘画时才需要调用抓取代码。