零基础开始QT绘图(4)

我们前面使用QPainter进行绘图一定意义上来说也算是基本满足要求了,但如果我们需要使图形和用户具备互动性,QPainter就无能为力了,或者实现起来就会非常的麻烦,但QT为了使我们免于麻烦,提供了一个特殊的对象,或者叫做图形框架QGraphicView。

接下来,我们就来看看这个框架究竟怎么使用。
首先我们要搞清楚,这个框架在哪里呢?它就在我们控件工具栏中,如下图:
零基础开始QT绘图(4)_第1张图片
我们使用时,就只要想button一样拖放到widget或者dialog上面即可。总的来说这个框架的使用还是比较简单的,基本类似于一个控件的使用。相比VC中实现图形互动容易不知道多少倍了(我们从VC6走过来的人,都应该知道Drawcli这个互动图形是始祖案例吧,有多麻烦我们心里自知)!总结起来,这个框架的使用分为以下四步:
1、从工具栏中拖放一个GraphicView到widget或者dialog中;
2、声明一个GraphicSence指针变量(最好在头文件中)
3、实例化GraphicSence变量,并将其与GraphicView绑定
4、添加GraphicItem

一、添加GraphicView至widget
上面我们提到了,这一步非常的容易,就是拖放一个控件那么容易,找到它,拖进去:
零基础开始QT绘图(4)_第2张图片
二、添加GraphicSence变量
这一步倒是容易出错,有可能会在建立GraphicSence变量的时候系统无法识别,如果强制运行则报错:21: error: ‘QGraphicsScene’ does not name a type,这是什么意思呢?很显然,我们缺少了头文件,记得在声明之前加入头文件QGraphicsScene,代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include 

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. 哈哈,郁闷吧。
零基础开始QT绘图(4)_第3张图片
所以,我们要小心!

四、向场景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;
}

运行效果如下:
零基础开始QT绘图(4)_第4张图片
到目前为止,我们并没有发现GraphicView这个框架给我们带来了什么,效果上与前面的QPainter基本没有什么差别,别着急,精彩的还在后面,这里还仅仅是做完了基本的准备工作,帮助小伙伴们克服可能遇到的困难和跳过那些本不该踏入的坑。下一篇开始我们就要领略其互动的强大功能了。

你可能感兴趣的:(QT,程序绘图)