【Qt官方例程学习笔记】Raster Window Example(画笔的平移/旋转/缩放应用)

这个例子显示了如何使用QPainter渲染一个简单的QWindow。

值得学习的内容

<QtGui>头文件

#include <QtGui>就可以使用Qt GUI模块中的所有类,当然,愿意的话也可以分开各个include。

QBackingStore与绘制

用于管理基于QPainter的图形的窗口后缓冲区。

在RasterWindow构造函数中,我们创建backingstore并将它应该管理的窗口实例传递给它。

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

resize时,也应该调整后缓冲区大小

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

绘制

  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);
  }

isExposed()保证窗口可见时才绘制。

异步渲染:让重绘发生在事件循环中(QWindow::requestUpdate())

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

我们通过使用QWindow::requestUpdate()请求更新来实现这一点,当系统准备重新绘制时,将交付重绘。

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

当发生UpdateRequest事件,窗口重绘时,调用renderNow()来立即呈现窗口。

原文地址:https://www.cnblogs.com/pplxlee/p/11013073.html