1. 程式人生 > 其它 >qt5繪圖和繪圖裝置

qt5繪圖和繪圖裝置

技術標籤:qt

Qt 的繪圖系統允許使用相同的 API 在螢幕和其它列印裝置上進行繪製。整個繪圖系統基於QPainter,QPainterDevice和QPaintEngine三個類。

QPainter用來執行繪製的操作;QPaintDevice是一個二維空間的抽象,這個二維空間允許QPainter在其上面進行繪製,也就是QPainter工作的空間;QPaintEngine提供了畫筆(QPainter)在不同的裝置上進行繪製的統一的介面。QPaintEngine類應用於QPainter和QPaintDevice之間,通常對開發人員是透明的。

除非你需要自定義一個裝置,否則你是不需要關心QPaintEngine這個類的。我們可以把QPainter理解成畫筆;把QPaintDevice理解成使用畫筆的地方,比如紙張、螢幕等;而對於紙張、螢幕而言,肯定要使用不同的畫筆繪製,為了統一使用一種畫筆,我們設計了QPaintEngine類,這個類讓不同的紙張、螢幕都能使用一種畫筆

下圖給出了這三個類之間的層次結構:

上面的示意圖告訴我們,Qt 的繪圖系統實際上是,使用QPainter在QPainterDevice上進行繪製,它們之間使用QPaintEngine進行通訊(也就是翻譯QPainter的指令)。

mywidget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
protected:
    //重寫繪圖事件,虛擬函式
    //如果在視窗繪圖,必須在繪圖事件裡實現
    //繪圖事件內部自動呼叫,視窗需要重繪的時候(狀態改變)
   void paintEvent(QPaintEvent *event);//QWidget 中定義的虛擬函式。
private slots:
   void on_pushButton_clicked();

private:
    Ui::Widget *ui;
    int x;
};

#endif // WIDGET_H

新建wiget類繼承與qwidget.通過重寫QWidget定義的虛擬函式 ,virtual void paintEvent(QPaintEvent *event)實現。通過幫助文件 F1知,paintEvent被呼叫的時機是,1.當視窗需要重新繪製時候。2.呼叫repaint() or update()函式來激發。3.其他原因。

mywidget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//畫家
#include<QBrush>//畫刷,填充顏色
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    x=0;
}

Widget::~Widget()
{
    delete ui;
}
 void Widget::paintEvent(QPaintEvent *event)
 {

     //QPainter p(this);//需要指定畫圖裝置,為widget視窗類物件。
     //方式2
     QPainter p;    //建立畫家物件 
     p.begin(this);//制定當前視窗為繪圖裝置
     //畫背景圖
     //p.drawPixmap(0,0,width(),height(),QPixmap("../image/image1.jpg"));
     //p.drawPixmap(rect(),QPixmap("../image/image1.jpg"));
     //繪圖操作
     //p.draw();
     // 定義畫筆
     QPen pen;
     pen.setWidth(5);
     pen.setColor(Qt::red);
      //pen.setColor(QColor(14,9,234));//reg設定顏色。右擊個性化,視窗顏色,顏色,裡面有reg
     pen.setStyle(Qt::DashLine);
     //把畫筆交給畫家
     p.setPen(pen);
     //劃線
     p.drawLine(50,50,150,50);
     p.drawLine(50,50,50,150);
     //建立畫刷物件
     QBrush brush;
     brush.setColor(Qt::red);
     brush.setStyle(Qt::Dense1Pattern);
     //把畫刷交給畫家
     p.setBrush(brush);
     //畫矩形
     p.drawRect(150,150,100,50);//起點座標,寬度,高度。
     //畫圓形
     p.drawEllipse(QPoint(150,150),50,25);
    //畫笑臉
     p.drawPixmap(x,200,80,80,QPixmap("../image/smile.jpg"));
     p.end();
 }

void Widget::on_pushButton_clicked()
{
   x+=20;
  if(x>width())//大於視窗寬度 width獲取視窗寬度
  {
      x=0;
  }
  //重新整理視窗,讓視窗重繪
  update();//間接呼叫painrEvent();手動重新整理視窗
}

QT5 學習之路24---Qt 繪製系統簡介

Qt5 學習之路及嵌入式開發教程20:Qt5繪圖---QPainterQt開發技術:

Qt繪圖系統(一)繪圖系統介紹