1. 程式人生 > >QT5學習筆記(一)畫圖

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 &center, qreal radius, const QPointF &focalPoint);
    * QRadialGradient(qreal cx, qreal cy, qreal radius, qreal fx, qreal fy);
    * 預設漸變開始的起點在圓心
    * QRadialGradient(const QPointF &center, qreal radius);
    * QRadialGradient(qreal cx, qreal cy, qreal radius);
    *
    * QRadialGradient(const QPointF &center, 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);
     *
     *
     *  */