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

零基礎開始QT繪圖(4)

我們前面使用QPainter進行繪圖一定意義上來說也算是基本滿足要求了,但如果我們需要使圖形和使用者具備互動性,QPainter就無能為力了,或者實現起來就會非常的麻煩,但QT為了使我們免於麻煩,提供了一個特殊的物件,或者叫做圖形框架QGraphicView。

接下來,我們就來看看這個框架究竟怎麼使用。
首先我們要搞清楚,這個框架在哪裡呢?它就在我們控制元件工具欄中,如下圖:
在這裡插入圖片描述
我們使用時,就只要想button一樣拖放到widget或者dialog上面即可。總的來說這個框架的使用還是比較簡單的,基本類似於一個控制元件的使用。相比VC中實現圖形互動容易不知道多少倍了(我們從VC6走過來的人,都應該知道Drawcli這個互動圖形是始祖案例吧,有多麻煩我們心裡自知)!總結起來,這個框架的使用分為以下四步:
1、從工具欄中拖放一個GraphicView到widget或者dialog中;
2、宣告一個GraphicSence指標變數(最好在標頭檔案中)
3、例項化GraphicSence變數,並將其與GraphicView繫結
4、新增GraphicItem

一、新增GraphicView至widget
上面我們提到了,這一步非常的容易,就是拖放一個控制元件那麼容易,找到它,拖進去:
在這裡插入圖片描述
二、新增GraphicSence變數
這一步倒是容易出錯,有可能會在建立GraphicSence變數的時候系統無法識別,如果強制執行則報錯:21: error: ‘QGraphicsScene’ does not name a type,這是什麼意思呢?很顯然,我們缺少了標頭檔案,記得在宣告之前加入標頭檔案QGraphicsScene,程式碼如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
   QGraphicsScene scene;	//這裡就是我們接下來要例項化的變數

private:
    Ui::MainWindow *ui;


};

#endif // MAINWINDOW_H

首先我們來執行一下,確保可以通過,然後我們再進行下來的步驟。

三、例項化變數並與檢視進行繫結

scene=new QGraphicsScene(this);
ui->graphicsView->setScene(scene);

就這兩句話,很簡單!!
但這裡也有一個很大的坑需要剛剛接觸QT的小夥伴們注意, ui->graphicsView->setScene(scene);這一句必須放在ui->setupUi(this);後面,否則編譯執行會出現程式崩潰,引發這樣的錯誤:
The program has unexpectedly finished.
The process was ended forcefully.
最後提示你,你的程式Crashed!
如果你是在Debug模式下,則會提示 The inferior stoped because it received a signal from the operating system. Signal name: SIGSEGV Signal meaning:Segmentation fault. 哈哈,鬱悶吧。
在這裡插入圖片描述


所以,我們要小心!

四、向場景Scene中新增圖形元素
比如,我們要新增一個矩形,或者繪製一行文字(這裡需要注意的是,QT5.10後任務圖形的型別使用都需要新增對應的標頭檔案,否則不能使用),如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{

    ui->setupUi(this);
    scene=new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);

    QGraphicsRectItem * rect1=new QGraphicsRectItem(QRect(20,20,this->width()/2,this->height()/2));
    QGraphicsTextItem *item = new QGraphicsTextItem("GraphicView running here!");
    scene->addItem(rect1);
    scene->addItem(item);

}

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

執行效果如下:
在這裡插入圖片描述
到目前為止,我們並沒有發現GraphicView這個框架給我們帶來了什麼,效果上與前面的QPainter基本沒有什麼差別,彆著急,精彩的還在後面,這裡還僅僅是做完了基本的準備工作,幫助小夥伴們克服可能遇到的困難和跳過那些本不該踏入的坑。下一篇開始我們就要領略其互動的強大功能了。