我们前面使用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基本没有什么差别,别着急,精彩的还在后面,这里还仅仅是做完了基本的准备工作,帮助小伙伴们克服可能遇到的困难和跳过那些本不该踏入的坑。下一篇开始我们就要领略其互动的强大功能了。