1. 程式人生 > >零基礎開始QT繪圖(1)

零基礎開始QT繪圖(1)

目前很多利用Arduino或者stm32來進行機器人或者相關的AI試驗的夥伴們,都有介面顯示或者圖形顯示的需求,如果僅僅是圖形顯示,我們完全可以藉助processing來完成,既方便又快捷,但Processing的不足時完整的介面編寫就變得困難了。
所以,我們可以藉助QT來完成帶有介面的繪圖應該是比較方便的,個人的觀點,至少比VC更容易。
從今天開始,我們來嘗試使用QT完成下位機需要的圖形顯示。當然,如果您不需要帶介面(選單、工具欄、狀態列)的繪圖可以參考我寫的Processing繪圖的相關文章。
Processing摸索前行(2)

在編寫繪圖程式之前,我們必須明白一點,QT中的繪圖一般在paintEvent下實現。而paintEvent是Widget類或者Widget派生類下的一個虛擬函式,需要實現它才能便於我們繪圖。
弄清楚了這個道理,那我們就可以著手開始我們的第一個繪圖程式啦。

第一步,在QT中建立一個Widgets程式:
在這裡插入圖片描述
當然,您如果覺得Widget讓你看著不舒服,不習慣,而你習慣了Form,那你完全可以進入程式把Widget刪除,然後自己新增一個form也是完全可以的。需要注意的是在選擇類資訊的時候注意選擇為Widget:
在這裡插入圖片描述

第二步,在Widget的cpp檔案中實現虛擬函式paintEvent,在標頭檔案中增加其宣告:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *event)
{
    
    
    
}

標頭檔案中增加宣告
在這裡插入圖片描述
第三步,在paintEvent中寫一個簡單的painter呼叫程式

#include "widget.h"
#include "ui_widget.h"
#include"qpainter.h"        //不加入這個標頭檔案,是不能呼叫QPainter的
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

//實現painterEvent
 void Widget::paintEvent(QPaintEvent *event)
{
      QPainter painters(this);   //初始化繪畫器
      painters.drawRect(this->width()/4,this->height()/4,this->width()/2,this->height()/2);  繪製矩形
      }

當然,別忘記在Widget的cpp中加入標頭檔案#include “qpainter.h”,否則你在寫painters.drawRect函式的時候就不會有智慧程式碼提示。當然也不會有程式的正確執行!
我們上面的程式就是在Widget的中央繪製了一個矩形,效果如下:
在這裡插入圖片描述
總結提煉:
1、在Processing中我們實現了虛擬函式void draw,而QT中我們實現了虛擬函式 void PaintEvent,不同的是Processing只有一個主檔案,而這裡我們的實現是在widget的cpp檔案中完成的。
2、Processing中沒有繪圖器(QPainter),直接可以繪圖,更不需要初始化Painter(當然,在VC中可能更復雜,需要初始化繪圖裝置)。
3、在Processing中,任何繪製都只直接顯示出來的,比如rect語句就是繪製矩形,而不需要藉助QPainter的drawRect的命令來實現繪製。
總結起來就是在QT中比Processing中多了一個步驟,即必須初始化一個QPainter。

好了,第一次繪圖,到這裡已經算完工了,後續我們將結合Arduino的感測器及通訊來完成一些稍微複雜一些的繪圖。