Qt学习之路(32):一个简易画板的实现(Graphics View)

本文配套源码

这一次将介绍如何使用Graphics View来实现前面所说的画板。前面说了很多有关Graphics View的好话,但是没有具体的实例很难说究竟好在哪里。现在我们就把前面的内容使用Graphics View重新实现一下,大家可以对比一下看有什么区别。

同前面相似的内容就不再叙述了,我们从上次代码的基础上进行修改,以便符合我们的需要。首先来看MainWindow的代码:

mainwindow.cpp

#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
 QToolBar *bar = this->addToolBar("Tools");
 QActionGroup *group = new QActionGroup(bar);
 QAction *drawLineAction = new QAction("Line", bar);
 drawLineAction->setIcon(QIcon(":/line.png"));
 drawLineAction->setToolTip(tr("Draw a line."));
 drawLineAction->setStatusTip(tr("Draw a line."));
 drawLineAction->setCheckable(true);
 drawLineAction->setChecked(true);
 group->addAction(drawLineAction);
 bar->addAction(drawLineAction);
 QAction *drawRectAction = new QAction("Rectangle", bar);
 drawRectAction->setIcon(QIcon(":/rect.png"));
 drawRectAction->setToolTip(tr("Draw a rectangle."));
 drawRectAction->setStatusTip(tr("Draw a rectangle."));
 drawRectAction->setCheckable(true);
 group->addAction(drawRectAction);
 bar->addAction(drawRectAction);
 QLabel *statusMsg = new QLabel;
 statusBar()->addWidget(statusMsg);
 PaintWidget *paintWidget = new PaintWidget(this);
 QGraphicsView *view = new QGraphicsView(paintWidget, this);
 setCentralWidget(view);
 connect(drawLineAction, SIGNAL(triggered()), this, SLOT(drawLineActionTriggered()));
 connect(drawRectAction, SIGNAL(triggered()), this, SLOT(drawRectActionTriggered()));
 connect(this, SIGNAL(changeCurrentShape(Shape::Code)), paintWidget, SLOT(setCurrentShape(Shape::Code)));
}
void MainWindow::drawLineActionTriggered()
{
 emit changeCurrentShape(Shape::Line);
}
void MainWindow::drawRectActionTriggered()
{
 emit changeCurrentShape(Shape::Rect);
}

由于mainwindow.h的代码与前文相同,这里就不再贴出。而cpp文件里面只有少数几行与前文不同。由于我们使用Graphics View,所以,我们必须把item添加到QGprahicsScene里面。这里,我们创建了scene的对象,而scene对象需要通过view进行观察,因此,我们需要再使用一个QGraphcisView对象,并且把这个view添加到MainWindow里面。

时间: 2024-08-02 05:52:50

Qt学习之路(32):一个简易画板的实现(Graphics View)的相关文章

Qt学习之路(31):一个简易画板的实现(QWidget)

说实话,本来我是没有打算放一个很大的例子的,一则比较复杂,二来或许需要很多次才能说得完.不过,现在已经说完了绘图部分,所以计划还是上一个这样的例子.这里我会只做出一个简单的画板程序,大体上就是能够画直线和矩形吧.这样,我计划分成两种实现,一是使用普通的QWidget作为画板,第二则是使用Graphcis View Framework来实现.因为前面有朋友说不大明白Graphics View的相关内容,所以计划如此. 好了,现在先来看看我们的主体框架.我们的框架还是使用Qt Creator创建一个

Qt 学习之路 2 --- 读书笔记

一.文章来由 来自豆子老师非常好的一本Qt教程,但是只有网络版,所以用这个做笔记了,不动笔墨不读书嘛~~ 二.读书笔记 1.Qt 学习之路 2(2):Qt 简介 1.1 关于 Qt 的一站式解决 Qt 是一个著名的 C++ 应用程序框架.但并不只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个"一站式"的解决方案:不再需要研究 STL,不再需要 C++ 的,不再需要到处去找解析 XML.连接数据库.访问网络的各种第三方库,因为

Qt学习之路(30):Graphics View Framework

现在基本上也已经到了2D绘图部分的尾声,所谓重头戏都是在最后压轴的,现在我们就要来看看在绘图部分功能最强大的Graphics View.我们经常说KDE桌面,新版本的KDE桌面就是建立在Graphics View的基础之上,可见其强大之处. Qt的白皮书里面这样写道:"Qt Graphics View 提供了用于管理和交互大量定制的 2D 图形对象的平面以及可视化显示对象的视图 widget,并支持缩放和旋转功能.Graphics View 使用 BSP(二进制空间划分)树形可非常快速地找到对象

Qt学习之路(23):自定义事件

Qt允许你创建自己的事件类型,这在多线程的程序中尤其有用,当然,也可以用在单线程的程序中,作为一种对象间通讯的机制.那么,为什么我需要使用事件,而不是使用信号槽呢?主要原因是,事件的分发既可以是同步的,又可以是异步的,而函数的调用或者说是槽的回调总是同步的.事件的另外一个好处是,它可以使用过滤器. Qt中的自定义事件很简单,同其他类似的库的使用很相似,都是要继承一个类进行扩展.在Qt中,你需要继承的类是QEvent.注意,在Qt3中,你需要继承的类是QCustomEvent,不过这个类在Qt4中

Qt学习之路(2):Hello,world!

任何编程技术的学习第一课基本上都会是Hello, world!,我也不想故意打破这个惯例--照理说,应该首先回顾一下Qt的历史,不过即使不说这些也并无大碍. 或许有人总想知道,Qt这个单词是什么意思.其实,这并不是一个缩写词,仅仅是因为它的发明者,TrollTech公司的 CEO,Haarard Nord和Trolltech公司的总裁Eirik Chambe-Eng在联合发明Qt的时候并没有一个很好的名字.在这里,字母Q是Qt库中所有类的前缀--这仅仅是因为在Haarard的emacs的字体中,

Qt学习之路(1):前言

我们所使用的Qt,确切地说也就是它的GUI编程部分.C++的GUI编程同Java不同:GUI并不是C++标准的一部分.所以,如果使用Java,那么你最好的选择就是AWT/Swing,或者也可以使SWT/JFace,但是,C++的GUI编程给了你更多的选择:wxWidget, gtk++以及Qt.这几个库我都有接触,但是接触都不是很多,只能靠一些资料和自己的一点粗浅的认识说一下它们之间的区别(PS: 更详尽的比较在前面的文章中有). 首先说wxWidget,这是一个标准的C++库,和Qt一样庞大.

Qt学习之路(3):Hello,world!(续)

下面来逐行解释一下前面的那个Hello, world!程序,尽管很简单,但却可以对Qt程序的结构有一个清楚的认识.现在再把代码贴过来: #include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel *label = new QLabel("Hello, world!"); label->sho

Qt学习之路(7):创建一个对话框(上)

首先说明一点,在C++ GUI Programming with Qt4, 2nd中,这一章连同以后的若干章一起,完成了一个比较完整的程序--一个模仿Excel的电子表格.不过这个程序挺大的,而且书中也没有给出完整的源代码,只是分段分段的--我不喜欢这个样子,我想要看到我写出来的是什么东西,这是最主要的,而不是慢慢的过上几章的内容才能看到自己的作品.所以,我打算换一种方式,每章只给出简单的知识,但是每章都能够运行出东西来.好了,扯完了,下面开始! 以前说的主要是一些基础知识,现在我们来真正做一个

Qt学习之路(8):创建一个对话框(下)

接着前一篇,下面是源代码部分: #include <QtGui> #include "finddialog.h" FindDialog::FindDialog(QWidget *parent) : QDialog(parent) { label = new QLabel(tr("Find &what:")); lineEdit = new QLineEdit; label->setBuddy(lineEdit); caseCheckBox