Qt之QWindow的介绍和使用

QWindow是一个基于窗口系统的抽象,它是Qt框架中表示窗口的底层类,它使用了现代的、底层的绘图技术,如OpenGL和Vulkan等,它提供了更高性能的绘图方式,适用于需要处理大量数据和实时图形的应用程序;QWindow的窗口管理完全由操作系统负责,它可以独立于其他窗口存在,也可以嵌入到其他窗口中,QWindow和QWidget都可以处理用户事件,如鼠标点击、键盘输入等,但它们处理事件的方式不同。QWindow通常需要使用底层的事件处理API,如WinAPI或Xlib等。

复制代码
#ifndef RASTERWINDOW_H
#define RASTERWINDOW_H

#include <QtGui>

class RasterWindow : public QWindow
{
    Q_OBJECT
public:
    explicit RasterWindow(QWindow *parent = nullptr);
    virtual void render(QPainter *painter);

public slots:
    void renderLater();
    void renderNow();

protected:
    bool event(QEvent *) override;

    void resizeEvent(QResizeEvent *) override;
    void exposeEvent(QExposeEvent *) override;

private:
    QBackingStore *m_backingStore;
};
复制代码
复制代码
#include "raster_window.h"

RasterWindow::RasterWindow(QWindow *parent) : QWindow(parent),m_backingStore(new QBackingStore(this))
{
    this->setGeometry(100, 100, 300, 200);
}

void RasterWindow::render(QPainter *painter)
{
    painter->drawText(QRectF(0, 0, width(), height()), Qt::AlignCenter, QStringLiteral("QWindow"));
}

void RasterWindow::renderLater()
{
    requestUpdate();
}

void RasterWindow::renderNow()
{
    if (!isExposed()) {
        return;
    }

    QRect rect(0, 0, width(), height());
    m_backingStore->beginPaint(rect);

    QPaintDevice *device = m_backingStore->paintDevice();
    QPainter painter(device);

    painter.fillRect(0, 0, width(), height(), QGradient::NightFade);
    render(&painter);
    painter.end();

    m_backingStore->endPaint();
    m_backingStore->flush(rect);
}

bool RasterWindow::event(QEvent *event)
{
    if (event->type() == QEvent::UpdateRequest) {
        renderNow();
    }

    return QWindow::event(event);
}

void RasterWindow::resizeEvent(QResizeEvent *resizeEvent)
{
    m_backingStore->resize(resizeEvent->size());
}

void RasterWindow::exposeEvent(QExposeEvent *)
{
    if (isExposed()) {
        renderNow();
    }
}
复制代码

  exposeEvent()是Qt框架中QWindow类及其子类中的一个事件处理函数。它用于处理窗口部件的重绘事件,即当窗口部件需要更新并重新绘制时,会触发exposeEvent()函数。

当窗口部件的外观需要更新时,比如窗口部件被暴露(显示)在窗口外部然后再次可见,或者窗口部件被其他窗口部件遮挡部分导致需要重新绘制时,Qt会发送一个重绘事件给窗口部件,并调用该窗口部件的exposeEvent()函数。

exposeEvent()函数中,可以编写自定义的绘图代码,将窗口部件的外观重新绘制出来。通常使用Qt提供的绘图工具类,如QPainter,来进行绘图操作。

  而QBackingStore是一个在Qt图形框架中使用的类,它主要用于提供双缓冲绘图功能。它的作用是在内存中创建一个缓冲区,用于存储绘图操作的结果,并在需要时将其内容绘制到屏幕上。

当进行绘图操作时,通常是在设备上直接绘制,这可能会导致屏幕闪烁或图像绘制不连续的问题。使用QBackingStore可以避免这些问题,通过在内存中创建一个缓冲区,所有的绘图操作都在缓冲区中进行,然后再一次性将整个缓冲区的内容绘制到屏幕上,从而实现平滑的绘图效果。

QBackingStore的主要功能包括:

  1. 提供一个像素缓冲区:QBackingStore会在内存中创建一个与设备屏幕相同大小的像素缓冲区。所有的绘图操作都在这个缓冲区中进行。

  2. 跟踪绘图操作:QBackingStore会跟踪所有的绘图操作,包括绘制图形、文本、图像等。这样可以确保在绘制到屏幕之前,所有的绘图操作都已经完成。

  3. 高效绘图:通过在内存中进行绘图操作,QBackingStore可以提供更高效的绘图方式。它可以避免频繁地将绘图操作直接绘制到屏幕上,从而减少屏幕闪烁和图像不连续的问题。

  4. 双缓冲绘图:QBackingStore使用双缓冲技术,即同时使用前缓冲区和后缓冲区。当绘图操作完成后,可以交换前后缓冲区的内容,从而实现平滑的绘图效果。

  在Qt中,requestUpdate()是一个函数,用于请求在下一个绘图帧中更新窗口或部件的内容。它是QWindow和QWidget类中的成员函数。requestUpdate()函数的作用是告诉Qt框架在下一个绘图帧中重新绘制窗口或部件的内容。这在需要实现动画、实时更新或异步绘图等场景中非常有用。调用requestUpdate()函数后,Qt框架会在下一个绘图帧中触发相应的重绘事件,然后调用窗口或部件的重绘函数,例如paintEvent()。在重绘函数中,可以更新窗口或部件的绘图内容,实现界面的更新。

posted @   TechNomad  阅读(1975)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示