【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()來立即呈現窗口。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM