【问题标题】:How to obtain the frame buffer from within QWidget's paintEvent()如何从 QWidget 的paintEvent() 中获取帧缓冲区
【发布时间】:2012-10-25 07:03:00
【问题描述】:

有没有什么办法可以得到将要显示在QWidget上的像素,做一些处理,然后显示处理后的像素?

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

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

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

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

有什么办法吗?

【问题讨论】:

    标签: qt


    【解决方案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();
    }
    

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

    【讨论】:

    • 谢谢。这非常接近我的需要。但是,我不想在这里绘制小部件的内容,只用我的图像处理算法对其进行修改。我实际上使用子类 QDeclarativeView 来呈现 QML 内容,但我需要在它出现在屏幕之前立即对其进行后过滤。
    • 好吧,看起来我可以在第一个painter.begin(&pixmap)...painter.end() 块内执行render(),这正是我需要的。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多