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的主要功能包括:
-
提供一个像素缓冲区:QBackingStore会在内存中创建一个与设备屏幕相同大小的像素缓冲区。所有的绘图操作都在这个缓冲区中进行。
-
跟踪绘图操作:QBackingStore会跟踪所有的绘图操作,包括绘制图形、文本、图像等。这样可以确保在绘制到屏幕之前,所有的绘图操作都已经完成。
-
高效绘图:通过在内存中进行绘图操作,QBackingStore可以提供更高效的绘图方式。它可以避免频繁地将绘图操作直接绘制到屏幕上,从而减少屏幕闪烁和图像不连续的问题。
-
双缓冲绘图:QBackingStore使用双缓冲技术,即同时使用前缓冲区和后缓冲区。当绘图操作完成后,可以交换前后缓冲区的内容,从而实现平滑的绘图效果。
在Qt中,requestUpdate()
是一个函数,用于请求在下一个绘图帧中更新窗口或部件的内容。它是QWindow和QWidget类中的成员函数。requestUpdate()
函数的作用是告诉Qt框架在下一个绘图帧中重新绘制窗口或部件的内容。这在需要实现动画、实时更新或异步绘图等场景中非常有用。调用requestUpdate()
函数后,Qt框架会在下一个绘图帧中触发相应的重绘事件,然后调用窗口或部件的重绘函数,例如paintEvent()
。在重绘函数中,可以更新窗口或部件的绘图内容,实现界面的更新。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?