您的位置:首页 > 编程语言 > Qt开发

零基础开始QT绘图(4)

2018-12-20 10:08 381 查看
版权声明:本博客所有原创文章未经准许不得转载或保存转发,本人保留版权法律追诉权。 https://blog.csdn.net/haigear/article/details/85111465

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

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: