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()来立即呈现窗口。

  • 相关阅读:
    netcore3.0使用Session
    docker redis使用
    协变和逆变
    HashTable、Dictionary、ConcurrentDictionary三者区别
    设计模式-行为型-解释器模式
    设计模式-行为型-备忘录模式
    jq实现批量全选与反选
    call()和apply()的用法及区别,看这个例子就明白了
    谈谈对闭包的理解
    export,import和export default的区别
  • 原文地址:https://www.cnblogs.com/pplxlee/p/11013073.html
Copyright © 2011-2022 走看看