qt5繪圖和繪圖裝置
阿新 • • 發佈:2021-01-27
技術標籤: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();手動重新整理視窗 }