零基础开始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基本没有什么差别,别着急,精彩的还在后面,这里还仅仅是做完了基本的准备工作,帮助小伙伴们克服可能遇到的困难和跳过那些本不该踏入的坑。下一篇开始我们就要领略其互动的强大功能了。
- 零基础开始QT绘图(1)
- Qt: 绘图基础(非常简洁明了,全面)
- Qt常用控件+事件+基础绘图(四)
- QT基础——13绘图设备
- qt绘图相关的基础知识
- Qt绘图基础
- QT绘图基础
- QT绘图基础(一)
- Qt 线程基础(QThread、QtConcurrent等)
- 关于Qt绘图控件qCustomPlot
- Android中Canvas绘图基础详解(附源码下载)
- Qt基础——获取QGraphicsScene的缩略图即导出到图片
- Android UI开发专题(二) 之绘图基础
- 【Heritrix基础教程之4】开始一个爬虫抓取的全流程代码分析
- qt绘图的方法
- 开始正题,现在是俄罗斯方块时间,这个是在打印字的基础上制作的!
- 黑马程序员---从头开始,回忆JAVA基础之反射
- 从基础开始:Qomo OpenProject中的一些关键词
- Qt 5.12开始支持Python