2019独角兽企业重金招聘Python工程师标准>>>

多些大家对我的支持啊!有朋友也提出,前面的几节有关event的教程缺少例子。因为event比较难做例子,也就没有去写,只是把大概写了一下。今天带来的是新的部分,有关Qt的2D绘图。这部分不像前面的内容,还是比较好理解的啦!所以,例子也会增加出来。
有人问豆子拿Qt做什么,其实,豆子就是在做一个Qt的画图程序,努力朝着Photoshop和GIMP的方向发展。但这终究要经过很长的时间、很困难的路程的,所以也放在网上开源,有兴趣的朋友可以来试试的呀…
好了,闲话少说,来继续我们的学习吧!
Qt的绘图系统允许使用相同的API在屏幕和打印设备上进行绘制。整个绘图系统基于QPainter,QPainterDevice和QPaintEngine三个类。
QPainter用来执行绘制的操作;QPaintDevice是一个二维空间的抽象,这个二维空间可以由QPainter在上面进行绘 制;QPaintEngine提供了画笔painter在不同的设备上进行绘制的统一的接口。QPaintEngine类用在QPainter和 QPaintDevice之间,并且通常对开发人员是透明的,除非你需要自定义一个设备,这时候你就必须重新定义QPaintEngine了。
下图给出了这三个类之间的层次结构(出自Qt API 文档):
这 种实现的主要好处是,所有的绘制都遵循着同一种绘制流程,这样,添加可以很方便的添加新的特性,也可以为不支持的功能添加一个默认的实现方式。另外需要说 明一点,Qt提供了一个独立的QtOpenGL模块,可以让你在Qt的应用程序中使用OpenGL功能。该模块提供了一个OpenGL的模块,可以像其他 的Qt组件一样的使用。它的不同之处在于,它是使用OpenGL作为显示技术,使用OpenGL函数进行绘制。对于这个组件,我们以后会再介绍。
 
通过前面的介绍我们知道,Qt的绘图系统实际上是说,使用QPainter在QPainterDevice上面进行绘制,它们之间使用QPaintEngine进行通讯。好了,下面我们来看看怎么使用QPainter。
 
首先我们定义一个组件,同前面的定义类似:
 
class PaintedWidget : public QWidget
{
public:
        PaintedWidget();

protected:
         void paintEvent(QPaintEvent * event);
};
这里我们只定义了一个构造函数,并且重定义paintEvent()函数。从名字就可以看出,这实际上是一个事件的回调函数。请注意,一般而 言,Qt的事件函数都是protected的,所以,如果你要重写事件,就需要继承这个类了。至于事件相关的东西,我们在前面的内容已经比较详细的叙述 了,这里不再赘述。
构造函数里面主要是一些大小之类的定义,这里不再详细说明:
PaintedWidget::PaintedWidget()
{
        resize(800, 600);
        setWindowTitle(tr( "Paint Demo"));
}
我们关心的是paintEvent()函数的实现:
void PaintedWidget::paintEvent(QPaintEvent * event)
{
        QPainter painter( this);
        painter.drawLine(80, 100, 650, 500);
        painter.setPen(Qt::red);
        painter.drawRect(10, 10, 100, 400);
        painter.setPen(QPen(Qt::green, 5));
        painter.setBrush(Qt::blue);
        painter.drawEllipse(50, 150, 400, 200);
}
为了把我们的程序运行起来,下面是main()函数:
int main( int argc, char *argv[])
{
        QApplication app(argc, argv);
        PaintedWidget w;
        w.show();
         return app.exec();
}
运行结果如下所示:
首先,我们声明了一个QPainter对象。注意,我们在这个函数的栈空间建立了对象,因此不需要delete。
QPainter接收一个QPaintDevice*类型的参数。QPaintDevice有很多子类,比如QImage,以及 QWidget。注意回忆一下,QPaintDevice可以理解成要在哪里去画,而现在我们希望在这个widget上画,因此传入的是this指针。
QPainter有很多以draw开头的函数,用于各种图形的绘制,比如这里的drawLine,drawRect和和drawEllipse 等。具体的参数请参阅API文档。下图给出了QPainter的draw函数的实例,本图来自C++ GUI Programming with Qt4, 2nd Edition.
好了,今天先到这里,我们将在下面一章中继续对这个paintEvent()函数进行说明。

转载于:https://my.oschina.net/iamhere/blog/423607

Qt学习之路(24): QPainter相关推荐

  1. Qt学习之路(24): QPainter(改写paintEvent)

    Qt学习之路(24): QPainter(改写paintEvent) 多些大家对我的支持啊!有朋友也提出,前面的几节有关event的教程缺少例子.因为event比较难做例子,也就没有去写,只是把大概写 ...

  2. QT学习之路2 学习笔记

    QT学习之路2 学习笔记 1.Qt 是一个著名的 C++ 应用程序框架.你并不能说它只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI 组件.使用 Qt,在一定程度上你获得的是一个&quo ...

  3. Qt学习之路_12(简易数据管理系统)

    原文地址为: Qt学习之路_12(简易数据管理系统) 前言 最近从大陆来到台湾,之间杂事很多,挤不出时间来更新博客- 这次主要是通过做一个简易的数据库管理系统,来学习在Qt中对数据库,xml,界面的各 ...

  4. 转载: Qt 学习之路 2归档

    Qt 学习之路 2归档 http://www.devbean.net/2012/08/qt-study-road-2-catelog/

  5. 对QT学习之路12-14的源代码补充与修正

    QT学习之路12-14的源代码有些不完整,为了更好的让大家学习,本人做了一点修正与补充,谢谢.源代码如下: 头文件: #ifndef MAINWINDOW_H #define MAINWINDOW_H ...

  6. java qt gui_工控编程,Qt 学习之路

    原标题:工控编程,Qt 学习之路 Qt 是一个著名的 C++ 库--或许并不能说这只是一个 GUI 库,因为 Qt 十分庞大,并不仅仅是 GUI.使用 Qt,在一定程序上你获得的是一个"一站 ...

  7. 《Qt 学习之路 2》

    Home / Qt 学习之路 2 / <Qt 学习之路 2>目录 <Qt 学习之路 2>目录 序 Qt 前言 Hello, world! 信号槽 自定义信号槽 Qt 模块简介 ...

  8. QT学习之路(一)ubuntu 18.04的Qt Creator在线安装

    文章目录 前言 一.准备工作 二.安装步骤 参考链接 前言 Qt是嵌入式开发的必备工具之一,在Linux下安装尤其重要. Qt是C++的一个库,或者说是开发框架,里面集成了一些库函数,提高开发效率. ...

  9. [记录]学习QT学习之路2第四天

    今天学习内容对应<<QT学习之路2>>第18到23部分,主要是有关于QT事件这一部分的内容(=_=真是看到我快吐了,感觉这本书不适合我这种初学者). 先放出思维导图 难点总结 ...

最新文章

  1. FaceShifter:一秒换脸的人脸交换模型
  2. 推荐《淘宝的可伸缩高性能互联网架构 》
  3. jQuery.Form.js 异步提交表单使用总结
  4. dba_segments和dba_tables的不同
  5. Activiti工作流框架学习(一)环境的搭建和数据表的了解
  6. golang 导入自定义包_二、Go基本命令及定制自定义第三方包
  7. 计算机考研补录,考研补录是什么意思 需要考试吗
  8. Codeforces - 346A - Alice and Bob - 简单数论
  9. 用react native 做的一个推酷客户端
  10. 身份证地址码mysql插入脚本
  11. win10专业版占多少空间_Win10系统
  12. 全国哀悼日,英来网停站一天。
  13. 69、消防电源及其配电的设置要求
  14. 苏州计算机英语怎么说,苏州用英语怎么说,苏州的英语单词
  15. html显示一条直线,如何在HTML中画一条线
  16. matlab矩阵输出txt文件中,matlab怎么把矩阵输出到txt
  17. ffmpeg混音(混声)命令
  18. 《摔跤吧,爸爸》观后感
  19. 超实用的企业公众号运营方案分享,建议收藏
  20. Cocos2d-x 2013春季新功能发布和发展规划

热门文章

  1. oracle 0 函数吗,Oracle9.2.0.1版函数编译一个小问题
  2. java中的23种设计模式_Java开发中的23种设计模式详解
  3. 架构师最怕程序员知道的十件事
  4. 担保债务凭证(Collateralized Debt Obligation,简称CDO) CLO/CBO
  5. JavaScript——max-age
  6. js 从一个函数中传递值到另一个函数
  7. Microsoft SQL Server Version List 版本列表
  8. 4.类型设计规范《.NET设计规范》
  9. 计算机基础知识:原码、反码、补码
  10. python 编程之计算器