【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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值