1  简介

参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=37

参考文档:《Qt教程.docx》

本文简单介绍Qt的绘图与绘图设备。

Qt的绘图系统基于三个类:QPainter,QPainterDevice和QPaintEngine。它们之间的层次关系结构如下:

QPainter:用于执行绘图的操作,可以把它想象成画家;

QPaintDevice:一个二维空间的抽象,这个二维空间允许QPainter在其上进行绘制。想象成画板;

QPaintEngine:提供了画笔(QPainter)在不同的设备上进行绘制的统一的接口。对开发人员透明。

我们可以把QPainter理解成画笔;把QPaintDevice理解成使用画笔的地方,比如纸张、屏幕等;而对于纸张、屏幕而言,肯定要使用不同的画笔绘制,为了统一使用一种画笔,我们设计了QPaintEngine类,这个类让不同的纸张、屏幕都能使用一种画笔。

Qt 的绘图系统实际上是,使用QPainter在QPainterDevice上进行绘制,它们之间使用QPaintEngine进行通讯(也就是翻译QPainter的指令)。

2  测试

下面写个测试代码来进行说明。

功能:在窗口上绘制直线、矩形、椭圆、添加背景图等。

(1)创建一个带ui的QWidget工程

(2)实现过程

我们只需要重写绘图事件处理函数就可以了,也就是void paintEvent(QPaintEvent *event);

如果在窗口绘图,必须放在绘图事件里实现 ;窗口需要重绘的时候(状态改变)绘图事件内部自动调用。

(3)实现效果

最终实现的效果如下:

(4)步骤说明

1)首先,我们需要创建一个绘图对象,并指定绘图设备(也就是准备画家和画板)。有两种方式:

方式一:QPainter p(this);   //创建画家,并指定当前窗口为绘图设备。

方式二:

     QPainter p;    //创建画家对象
p.begin(this); //指定当前窗口为绘图设备
//绘图操作
//p.drawxxxx();
p.end();

我们这里使用方式二。

2)上图中的线宽以及颜色,我们是使用画笔QPen实现的;上图中矩形和椭圆形中的填充色,我们是使用画刷QBrush实现的。

我们创建了画笔对象和画刷对象之后,需要把它们交给画家,也就是QPainter。

     //定义画笔
QPen pen;
pen.setWidth(); //设置线宽5pix
//pen.setColor(Qt::red); //设置颜色
pen.setColor(QColor(, , )); //rgb设置颜色
pen.setStyle(Qt::DashLine); //设置风格
//把画笔交给画家
p.setPen(pen); //创建画刷对象
QBrush brush;
brush.setColor(Qt::red); //设置颜色
brush.setStyle(Qt::Dense1Pattern); //设置样式
//把画刷交给画家
p.setBrush(brush);

3)绘制背景图

使用drawPixmap函数,有好几种方式,这里说两种:

 //    p.drawPixmap(0, 0, width(), height(), QPixmap(":/new/prefix1/image/superman.jpg"));
p.drawPixmap(rect(), QPixmap(":/new/prefix1/image/background.png")); //获取矩形

4)绘制直线

上图中的第一个正方形是用直线拼出来的,绘制直线使用drawLine()函数。

     //画直线
p.drawLine(, , , );
p.drawLine(, , , );
p.drawLine(, , , );
p.drawLine(, , , );

5)绘制矩形

     //画矩形
p.drawRect(, , , );

6)绘制椭圆

     //画圆
p.drawEllipse(QPoint(, ), , );

5)绘制笑脸

上图中显示点击按钮并让笑脸移动是使用update()函数实现的,当我们点击按钮时,就在按钮的槽函数中调用update()进行更新窗口。

     //画笑脸
p.drawPixmap(x, , , , QPixmap(":/new/prefix1/image/face.png"));

下面给出widget.cpp的完整代码:

 #include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPen>
#include <QBrush> Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); x = ;
} Widget::~Widget()
{
delete ui;
} void Widget::paintEvent(QPaintEvent *event)
{
//方式一:
// QPainter p(this); //方式二:
QPainter p; //创建画家对象
p.begin(this); //指定当前窗口为绘图设备
//绘图操作
//p.drawxxxx();
//画背景图
// p.drawPixmap(0, 0, width(), height(), QPixmap(":/new/prefix1/image/superman.jpg"));
p.drawPixmap(rect(), QPixmap(":/new/prefix1/image/background.png")); //获取矩形 //定义画笔
QPen pen;
pen.setWidth(); //设置线宽5pix
//pen.setColor(Qt::red); //设置颜色
pen.setColor(QColor(, , )); //rgb设置颜色
pen.setStyle(Qt::DashLine); //设置风格
//把画笔交给画家
p.setPen(pen); //创建画刷对象
QBrush brush;
brush.setColor(Qt::red); //设置颜色
brush.setStyle(Qt::Dense1Pattern); //设置样式
//把画刷交给画家
p.setBrush(brush); //画直线
p.drawLine(, , , );
p.drawLine(, , , );
p.drawLine(, , , );
p.drawLine(, , , ); //画矩形
p.drawRect(, , , ); //画圆
p.drawEllipse(QPoint(, ), , ); //画笑脸
p.drawPixmap(x, , , , QPixmap(":/new/prefix1/image/face.png")); p.end();
} void Widget::on_pushButton_clicked()
{
x += ;
if (x > width()) {
x = ;
}
//刷新窗口,让窗口重绘制,整个窗口都重绘
update(); //间接调用paintEvent
}

widget.h的代码:

 #ifndef WIDGET_H
#define WIDGET_H #include <QWidget> namespace Ui {
class Widget;
} class Widget : public QWidget
{
Q_OBJECT public:
explicit Widget(QWidget *parent = );
~Widget(); protected:
//重写绘图事件
//如果在窗口绘图,必须放在绘图事件里实现
//绘图事件内部自动调用,窗口需要重绘的时候(状态改变)
void paintEvent(QPaintEvent *event); private slots:
void on_pushButton_clicked(); private:
Ui::Widget *ui;
int x; }; #endif // WIDGET_H

Qt-绘图的更多相关文章

  1. Qt绘图

    Qt绘图的设置 QPainter::Antialiasing // 反锯齿 QPainter::TextAntialiasing // 文字反锯齿 QPainter::SmoothPixmapTran ...

  2. Qt绘图之QGraphicsScene QGraphicsView QGraphicsItem详解

    Graphics View提供了一个界面,它既可以管理大数量的定制2D graphical items,又可与它们交互,有一个view widget可以把这些项绘制出来,并支持旋转与缩放.这个柜架也包 ...

  3. 简单的QT绘图程序(把全部的点都记录下来,然后在paintEvent里使用drawLine函数进行绘制,貌似效率很低。。。)

    当初在学MFC时,最经典的入门实例就是绘图程序,其作用相当于Console Application 下的Hello World了吧. 如今入手QT,不免怀旧,于是也写了一个绘图程序,虽然简单,却也是入 ...

  4. 界面编程之QT绘图和绘图设备20180728

    /*******************************************************************************************/ 一.绘图 整 ...

  5. Qt 绘图与动画系统

    Qt 提供了内置的绘图系统以及独立的QtOpenGL模块提供对OpenGL的支持.Qt提供了基于状态机的QPainter系统和面向对象的Graphics View系统. QPainter 基于状态机的 ...

  6. Qt——绘图

    1.涉及类 QPainter  QPaintEngine QPaintDevice 作为绘图的使用者,只需要关注 QPainter 和 QPaintDevice 2.QPainter 使用 QPain ...

  7. Qt 绘图(QBitmap,QPixmap,QImage,QPicture)

    QPainter绘图绘图设备(QPixmap,QImage,QBitmap,QPicture) 重写绘图事件,虚函数 如果窗口绘图,必须放在绘图事件里实现 绘图事件内部自动调用,窗口需要重绘的时候,状 ...

  8. Qt绘图学习(1)

    paintEvent()被调用的时机;1.当窗口第一次被show()的时候,Qt程序会自动产生一个绘图事件,调用绘图事件:2.重新调整窗口部件大小的时候,系统也会产生一个绘制事件.3.当窗口部件被其他 ...

  9. Qt绘图浅析与实例

    1. Qt5位置相关函数 Q提供了很多关于获取窗体位置及显示区域大小的函数,如x().y()和pos().rect().size().geometry()等,统称为"位置相关函数" ...

  10. Qt: 绘图基础(非常简洁明了,全面)

    QPainter 能绘制: point, line, rectangle, ellipse, arc, chord, polygon, pie segment, Bezier curve, QPixm ...

随机推荐

  1. Java实现 LeetCode 31下一个排列

    31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...

  2. Java实现第九届蓝桥杯分数

    分数 题目描述 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项, 求这个和是多少,结果用分数表示出来. 类似: 3/2 当然,这只是加了前2项而 ...

  3. Java培训Day02——制作疫情地图(一)

    一.前言 此次培训,是为期三天的网上培训.最终的目的是制作出疫情地图.首先我们来看看主要的讲课内容大纲. Day1 |-Java语法学习(个人感觉讲得还可以,主要围绕本次培训作出的讲解,没有像网上的基 ...

  4. SpringBoot爬坑系列

    1.日志篇 现象 由于日志配置采用原来SpringMVC项目中的log4j.properties 文件,日志采用springboot自带的jar包会出现打印不出日志的情况. 解决 引入原日志包 < ...

  5. MySQL连接查询驱动表被驱动表以及性能优化

    准备我们需要的表结构和数据 两张表 studnet(学生)表和score(成绩)表, 创建表的SQL语句如下 CREATE TABLE `student` ( `id` int(11) NOT NUL ...

  6. control+Z的逆 control+Y

    接触过电脑的朋友一定知道control键加Z可以在大多时候撤销我们前一步的操作,相当于计算机系统里最“广谱”的后悔药. 然而,你有没有在编辑文本的时候却因为撤销的操作而后悔?输入文本之后撤销,发现少了 ...

  7. vc6.0打开类向导时报错-Parsing error: Expected ";".Input Line: "解决方法

    --------------------------- Microsoft Visual C++ --------------------------- Parsing error:  Expecte ...

  8. s7-200高速脉冲输出与高速计数器讲解

    s7-200高速脉冲输出与高速计数器讲解

  9. 国外一教授坦言,用这方法能迅速成为python程序员,但都不愿意说_编程小十

    越来越多的人学习python,但你学习python用了多长的时间?#Python# 你知道如何才能迅速掌握并成为python程序员吗?   有这样的一位国外的教授说,要迅速成为python程序员,几乎 ...

  10. 前台页面id为空--驼峰命名映射

    错误: 前台页面id为空,或其他数据映射问题(方案2) 原因: java的bean类属性和数据库字段命名不一致,查询的时候就不能把数据封装进bean类里,  在数据库字段命名规范中,通常使用下划线“_ ...