zoukankan      html  css  js  c++  java
  • 【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()来立即呈现窗口。

  • 相关阅读:
    oracle 内连接、外连接、自然连接、交叉连接练习
    oracle语句练习
    简单的oracle sql语句练习
    CountDownLatch 使用方法
    T1,T2,T3 三个线程顺序执行
    【2018 校招真题】斐波那契数列
    使用自己的域名解析 cnblogs 博客
    在 github 中新建仓库后,如何上传文件到这个仓库里面。
    数据库常用语句整理
    使用 JQuery 实现将 table 按照列排序
  • 原文地址:https://www.cnblogs.com/pplxlee/p/11013073.html
Copyright © 2011-2022 走看看