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