QT5學習筆記(一)畫圖
在QT的學習道路上一直苦於沒有好的教程,其中有QT學習之路,還有qt實戰一二三等,比較好的部落格的但是也總是感覺不是很方便,QT學習之路講的過於簡單,但是其中的貪吃蛇的小程式倒是挺不錯的一個練習。而qt實戰的部落格裡面講的比較翔實,但是特別不成體系,比較亂,不知道從哪開始學習。而我購買的金大的QT教程,裡面講的特別詳細,但是沒有可以直接執行的程式碼,全部都是各種控制元件,類等的用法感覺很枯燥,用作備查手冊比較好。但是不適合入門的新手學習。最後,我在QT開源社群內找到一個QT4的教程,雖然是QT4但是對於5也是完全適用的,下面使我的學習的心得與記錄。在程式碼中有詳細的註釋,用可以執行的程式碼來帶領學習我覺得更加該高效。下面給出
程式碼如下
每一步都會有詳細的註釋,都可以f2轉到定義來找到,可以先看程式碼敲一邊然後再看教程
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QPainter>//包含繪圖操作的標頭檔案 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this); //畫直線 f2進入定義發現 /* 畫直線的函式一共有5個過載函式 * inline void drawLine(const QLineF &line); * inline void drawLine(const QPointF &p1, const QPointF &p2);//點到點 * inline void drawLine(const QPoint &p1, const QPoint &p2);//點到點 * inline void drawLine(const QLine &line); * inline void drawLine(int x1, int y1, int x2, int y2);//點的xy值到點的xy值 * * */ /*case 1 painter.drawLine(QPointF(0,0),QPointF(100,100)); case 1*/ /*畫矩形 同樣f2到定義,一共有三個過載函式 * * inline void drawRect(const QRectF &rect); * x y是矩形左上角的座標 w 與h 分別是width寬度和high高度 * inline void drawRect(int x1, int y1, int w, int h); * //直接給傳給函式一個矩形物件 * inline void drawRect(const QRect &rect); * */ /* case 2 QPen pen;//定義了一個QPen筆物件 QBrush brush(QColor(0,255,0,125));//筆刷 pen.setColor(QColor(255,0,0));//設定筆的顏色 painter.setPen(pen); painter.setBrush(brush); painter.drawRect(50,50,200,100);//畫一個矩形 case 2*/ /* 畫圓弧 * 發現有三個過載函式 * 原理都是先畫一個矩形,然後指定開始角度和跨越角度,不再詳述 * */ /* case 3 QRectF rectangle(10.0, 20.0, 80.0, 60.0); //矩形 //為了增加精度,QT將每一度分為30份,所以10度 是對應10×30 20度對應20×30 int startAngle = 30 * 16; //起始角度 int spanAngle = 120 * 16; //跨越度數 painter.drawArc(rectangle, startAngle, spanAngle); case 3*/ /* * 漸變填充 * 線性漸變(linear gradient)在開始點和結束點之間插入顏色; * 輻射漸變(radial gradient)在焦點和環繞它的圓環間插入顏色; * 錐形漸變(Conical)在圓心周圍插入顏色。 * */ //線性漸變 /* case 4 QLinearGradient linearGradient(QPointF(10, 20), QPointF(100, 60)); //定義了一個線性漸變的物件,其中矩形右上角是漸變的開始點,矩形的右下角是漸變的終點 //插入顏色 //漸變變數從起點時為0 終點時為1 ,線性變換 linearGradient.setColorAt(0, Qt::yellow); linearGradient.setColorAt(0.5, Qt::red); linearGradient.setColorAt(1, Qt::green); //指定漸變區域以外的區域的擴散方式 linearGradient.setSpread(QGradient::ReflectSpread); //在漸變區域外是重複變化 //可選擇的物件有,按f2找到 可分別實驗效果 //PadSpread, //ReflectSpread, //RepeatSpread //使用漸變作為畫刷 painter.setBrush(linearGradient); //測試線性漸變 //painter.drawRect(10, 20, 90, 40); //測試漸變區域外的擴散方式 painter.drawRect(0, 0, 500, 500); case 4*/ //輻射漸變 /*對於輻射漸變我們只需要理解建構函式的意思便可 * 對於QradialGradient類 由多個過載建構函式,同樣我們轉到定義 * 其中 * QRadialGradient(); * 第一個點是漸變區域的原點,然後是區域半徑,最後一個點是漸變開始的起點 * * QRadialGradient(const QPointF ¢er, qreal radius, const QPointF &focalPoint); * QRadialGradient(qreal cx, qreal cy, qreal radius, qreal fx, qreal fy); * 預設漸變開始的起點在圓心 * QRadialGradient(const QPointF ¢er, qreal radius); * QRadialGradient(qreal cx, qreal cy, qreal radius); * * QRadialGradient(const QPointF ¢er, qreal centerRadius, const QPointF &focalPoint, qreal focalRadius); * QRadialGradient(qreal cx, qreal cy, qreal centerRadius, qreal fx, qreal fy, qreal focalRadius); * * */ //QRadialGradient radialGradient(QPointF(100, 190),50,QPointF(275,200)); /* case 5 QRadialGradient radialGradient(100, 190,100); //和線性漸變一樣,變數從0到1變化 radialGradient.setColorAt(0, QColor(255, 255, 100, 150)); radialGradient.setColorAt(1, QColor(0, 0, 0, 50)); painter.setBrush(radialGradient); painter.drawEllipse(QPointF(100, 190), 50, 50); case 5*/ //錐形漸變 /* * 和前面的一樣,建構函式第一個引數是原點 * 後面一個是半徑 * * */ /*case 6 QConicalGradient conicalGradient(QPointF(250, 190), 60); conicalGradient.setColorAt(0.2, Qt::cyan); conicalGradient.setColorAt(0.9, Qt::black); painter.setBrush(conicalGradient); painter.drawEllipse(QPointF(250, 190), 50, 50); case 6*/ //繪製文字 /*繪製文字主要需要理解下面兩個內容 * 1 函式drawText * 2 字型格式類 QFont * ===========drawText========= * 點p與設定的字型的左下角對齊 * void drawText(const QPointF &p, const QString &s); * inline void drawText(const QPoint &p, const QString &s); * inline void drawText(int x, int y, const QString &s); * * void drawText(const QPointF &p, const QString &str, int tf, int justificationPadding); * 第一個引數是字型放置區域的矩形 * 第二個引數是放置的方式 具體位置看下面的例子 * AlignLeft = 0x0001, * AlignLeading = AlignLeft, AlignRight = 0x0002, AlignTrailing = AlignRight, AlignHCenter = 0x0004, AlignJustify = 0x0008, AlignAbsolute = 0x0010, AlignTop = 0x0020, AlignBottom = 0x0040, AlignVCenter = 0x0080, AlignBaseline = 0x0100, * * 第三個引數是需要繪製的文字 * 第四個預設引數 * * void drawText(const QRectF &r, int flags, const QString &text, QRectF *br = Q_NULLPTR); * void drawText(const QRect &r, int flags, const QString &text, QRect *br = Q_NULLPTR); * inline void drawText(int x, int y, int w, int h, int flags, const QString &text, QRect *br = Q_NULLPTR); * * void drawText(const QRectF &r, const QString &text, const QTextOption &o = QTextOption()); * * ===========QFont============ * * 設定下劃線 上劃線等 * 設定字母大小寫 * 設定字元間的間距 * * */ /* case 7 //設定一個矩形 QRectF rect(20, 20, 300, 200); //為了更直觀地看到字型的位置,我們繪製出這個矩形 painter.drawRect(rect); painter.setPen(QColor(Qt::red)); //我們這裡先讓字型水平居中 //函式1 2 //painter.drawText(QPoint(320,220),"第一,二個建構函式");//該點是矩形的右下角 //函式 3 //painter.drawText(100,100,"第三個建構函式");//也是矩形的右下角 //函式4 5 6 //AlignHCenter引數指在矩形中間 painter.drawText(rect,Qt::AlignLeft,"AlignLeft");//第二個引數是在矩形的中間 painter.drawText(rect,Qt::AlignRight,"AlignRight");//右上角 painter.drawText(rect,Qt::AlignHCenter,"AlignHCenter");//中間 painter.drawText(rect,Qt::AlignJustify,"AlignJustify"); painter.drawText(rect,Qt::AlignAbsolute,"AlignAbsolute"); painter.drawText(rect,Qt::AlignTop,"AlignTop"); painter.drawText(rect,Qt::AlignBottom,"AlignBottom");//左下角 painter.drawText(rect,Qt::AlignVCenter,"AlignVCenter");//左中間 painter.drawText(rect,Qt::AlignBaseline,"AlignBaseline"); //函式7 //painter.drawText(rect,"第七個建構函式");//與矩形的左上角對齊 QFont font("宋體", 15, QFont::Bold, true); //設定下劃線 font.setUnderline(true); //設定上劃線 font.setOverline(true); //設定字母大小寫 font.setCapitalization(QFont::SmallCaps); //設定字元間的間距 font.setLetterSpacing(QFont::AbsoluteSpacing, 10); //使用字型 painter.setFont(font); painter.setPen(Qt::green); painter.drawText(120, 80, tr("yafeilinux")); painter.translate(50, 50);//對字型的平移操作 painter.rotate(90);//對字型的旋轉操作 painter.drawText(0, 0, tr("helloqt")); case 7*/ //繪製路徑 QPainterPath path; path.addRect(50, 50, 40, 40);//繪製完矩形後坐標落在矩形的左上角 path.lineTo(100, 100);//從左上角畫到(100,100) path.moveTo(200, 200);//將路徑當前點移動到(200,200) path.lineTo(300,400);//畫直線到(300,400) painter.drawPath(path); //繪製圖片 /*drawPixmap函式 * * void drawPixmap(const QRectF &targetRect, const QPixmap &pixmap, const QRectF &sourceRect); inline void drawPixmap(const QRect &targetRect, const QPixmap &pixmap, const QRect &sourceRect); inline void drawPixmap(int x, int y, int w, int h, const QPixmap &pm, int sx, int sy, int sw, int sh); inline void drawPixmap(int x, int y, const QPixmap &pm, int sx, int sy, int sw, int sh); inline void drawPixmap(const QPointF &p, const QPixmap &pm, const QRectF &sr); inline void drawPixmap(const QPoint &p, const QPixmap &pm, const QRect &sr); void drawPixmap(const QPointF &p, const QPixmap &pm); inline void drawPixmap(const QPoint &p, const QPixmap &pm); inline void drawPixmap(int x, int y, const QPixmap &pm); inline void drawPixmap(const QRect &r, const QPixmap &pm); inline void drawPixmap(int x, int y, int w, int h, const QPixmap &pm); * * * */ QPixmap pix; pix.load("../painter_2/logo.png");//中間是圖片的地址,最好是絕對地址避免出錯 painter.drawPixmap(0, 0, 129, 66, pix);//常用的兩個函式過載 //前面兩個引數是圖片的位置,後面是圖片的大小 //drawPixmap(0,0,pix)按照圖片原來的大小來繪製圖片 }
基礎圖形
繪製直線
/* 畫直線的函式一共有5個過載函式 * inline void drawLine(const QLineF &line); * inline void drawLine(const QPointF &p1, const QPointF &p2);//點到點 * inline void drawLine(const QPoint &p1, const QPoint &p2);//點到點 * inline void drawLine(const QLine &line); * inline void drawLine(int x1, int y1, int x2, int y2);//點的xy值到點的xy值 * * */
繪製矩形
/*畫矩形 同樣f2到定義,一共有三個過載函式
*
* inline void drawRect(const QRectF &rect);
* x y是矩形左上角的座標 w 與h 分別是width寬度和high高度
* inline void drawRect(int x1, int y1, int w, int h);
* //直接給傳給函式一個矩形物件
* inline void drawRect(const QRect &rect);
* */
繪製圓弧
/* 畫圓弧
* 發現有三個過載函式
* 原理都是先畫一個矩形,然後指定開始角度和跨越角度,不再詳述
* */
漸變填充
/** 漸變填充
* 線性漸變(linear gradient)在開始點和結束點之間插入顏色;
* 輻射漸變(radial gradient)在焦點和環繞它的圓環間插入顏色;
* 錐形漸變(Conical)在圓心周圍插入顏色。
* */
線性漸變
輻射漸變
/*對於輻射漸變我們只需要理解建構函式的意思便可* 對於QradialGradient類 由多個過載建構函式,同樣我們轉到定義
* 其中
* QRadialGradient();
* 第一個點是漸變區域的原點,然後是區域半徑,最後一個點是漸變開始的起點
*
* QRadialGradient(const QPointF ¢er, qreal radius, const QPointF &focalPoint);
* QRadialGradient(qreal cx, qreal cy, qreal radius, qreal fx, qreal fy);
* 預設漸變開始的起點在圓心
* QRadialGradient(const QPointF ¢er, qreal radius);
* QRadialGradient(qreal cx, qreal cy, qreal radius);
*
* QRadialGradient(const QPointF ¢er, qreal centerRadius, const QPointF &focalPoint, qreal focalRadius);
* QRadialGradient(qreal cx, qreal cy, qreal centerRadius, qreal fx, qreal fy, qreal focalRadius);
*
* */
錐形漸變
/** 和前面的一樣,建構函式第一個引數是原點
* 後面一個是半徑
* */
繪製文字
/*繪製文字主要需要理解下面兩個內容
* 1 函式drawText
* 2 字型格式類 QFont
* ===========drawText=========
* 點p與設定的字型的左下角對齊
* void drawText(const QPointF &p, const QString &s);
* inline void drawText(const QPoint &p, const QString &s);
* inline void drawText(int x, int y, const QString &s);
*
* void drawText(const QPointF &p, const QString &str, int tf, int justificationPadding);
* 第一個引數是字型放置區域的矩形
* 第二個引數是放置的方式 具體位置看下面的例子
* AlignLeft = 0x0001,
* AlignLeading = AlignLeft,
AlignRight = 0x0002,
AlignTrailing = AlignRight,
AlignHCenter = 0x0004,
AlignJustify = 0x0008,
AlignAbsolute = 0x0010,
AlignTop = 0x0020,
AlignBottom = 0x0040,
AlignVCenter = 0x0080,
AlignBaseline = 0x0100,
*
* 第三個引數是需要繪製的文字
* 第四個預設引數
*
* void drawText(const QRectF &r, int flags, const QString &text, QRectF *br = Q_NULLPTR);
* void drawText(const QRect &r, int flags, const QString &text, QRect *br = Q_NULLPTR);
* inline void drawText(int x, int y, int w, int h, int flags, const QString &text, QRect *br = Q_NULLPTR);
*
* void drawText(const QRectF &r, const QString &text, const QTextOption &o = QTextOption());
*
* ===========QFont============
*
* 設定下劃線 上劃線等
* 設定字母大小寫
* 設定字元間的間距
*
* */
繪製路徑
繪製圖片
/*drawPixmap函式
*
*
void drawPixmap(const QRectF &targetRect, const QPixmap &pixmap, const QRectF &sourceRect);
inline void drawPixmap(const QRect &targetRect, const QPixmap &pixmap, const QRect &sourceRect);
inline void drawPixmap(int x, int y, int w, int h, const QPixmap &pm,
int sx, int sy, int sw, int sh);
inline void drawPixmap(int x, int y, const QPixmap &pm,
int sx, int sy, int sw, int sh);
inline void drawPixmap(const QPointF &p, const QPixmap &pm, const QRectF &sr);
inline void drawPixmap(const QPoint &p, const QPixmap &pm, const QRect &sr);
void drawPixmap(const QPointF &p, const QPixmap &pm);
inline void drawPixmap(const QPoint &p, const QPixmap &pm);
inline void drawPixmap(int x, int y, const QPixmap &pm);
inline void drawPixmap(const QRect &r, const QPixmap &pm);
inline void drawPixmap(int x, int y, int w, int h, const QPixmap &pm);
*
*
* */