注: 仅供本人学习参考。
Qt 2D绘图所用到的函数:
头文件:#include <QPainter>
void paintEvent(QPaintEvent *);//所有的图形绘制都必须放在此函数里面。
paintEvent函数是进行重绘的函数,只要出现如下几种情况,系统就会产生屏幕重绘事件, 从而自动调用paintEvent函数:
(1)当窗口部件第一次显示时。
(2)重新调整窗口部件大小,或者窗口从隐藏到显示。
(3)当窗口部件被其他部件遮挡,然后又再次显示出来时,就会对隐藏的区域产生一个重绘。
事件。
程序员如果想调用这个函数,只能通过repaint()函数或者update()函数,而且这两个函数都是对整个屏幕进行重绘,如果只想重绘屏幕的一部分,调用上述两个函数时就需要把参数带上,比如repaint(x,y,w,h)就是重绘屏幕上以(x,y)为左上角定点,宽为w,高为h的矩形区域。
总结一下,使用Qt进行2D绘图的问题就在于,不能随时随地调用绘画的函数,而且进行绘画的命令不是我一个人说了算,系统的优先级要高于我。
解决方案如下:
设置一个全局变量tag标记,paintEvent函数内用if-else语句根据这个tag的值不同而执行不同的语句,tag=-1对应的执行语句为空,只要tag=-1,不管系统怎么调用这个函数都没用,只是会清屏罢了,这个避免不了,因为系统调用这个函数的时候可没有设置重绘的范围,是全部都重绘的,如果没用重绘的具体语句,就相当于清屏了。
原文链接:https://blog.csdn.net/sinat_41909065/article/details/83246957
一 . 绘制图像基础
Qt提供了4个类来处理图像:QImage、QPixmap、QBitmap、QPicture,为了对这几个类加以区分,分别称QImage为图像、QPixmap为像素图、QBitmap为位图、QPicture为图片,这些类的区别及作用如下
①、QImage类提供了一个与硬件无关的图像表示方法,可以直接访问和操控像素,也就是说该类可修改或编辑图像的像素。该类还可以用于进行I/O处理,并对I/O处理操作进行了优化
②、QPixmap类主要用于在屏幕上显示图像,QPixmap中的像素数据是由底层窗口系统进行管理的,该类不能直接访问和操控像素,只能通过QPainter的相应函数或把QPixmap转换为QImage来访问和操控像素。QPixmap可通过标签(QLabel类)或QAbstractButton的子类(icon属性)显示在屏幕上。
③、QBitmap是QPixmap的子类,用于处理颜色深度为1的图像,即只能显示黑白两种颜色。
④、QPicture用来记录并重演QPainter命令,QPicture与分辨率无关,可在不同设备上显示。该类使用一个与平台无关的格式(.pic格式)把绘图命令序列化到I/O设备,所有可绘制在QWidget部件或QPixmap上的内容都可以保存在QPicture中,该类的主要作用是把一个绘制设备上使用QPainter绘制的所有图形保存在QPicture之中,然后再把这些图形重新绘制在其他绘图设备上。
通常,可以使用QImage类来加载并操作图像数据,然后把QImage对象转换为QPixmap再显示到屏幕上,若不需对图像进行操作,也可直接使用QPixmap来加载并显示图像。
QImage、QPixmap、QBitmap、QPicture都是QPaintDevice类的子类(直接或间接),因此他们都是绘制设备,可以直接在其上进行图形绘制。
更多基础内容可以转至大佬原文链接:https://blog.csdn.net/hyongilfmmm/article/details/83233589
dialog.h:
#ifndef DIALOGIO_H
#define DIALOGIO_H
#include <QDialog>
#include <QPainter>
namespace Ui {
class DialogIO;
}
class DialogIO : public QDialog
{
Q_OBJECT
public:
explicit DialogIO(QWidget *parent = 0);
~DialogIO();
void paintEvent(QPaintEvent *event);
private:
Ui::DialogIO *ui;
int tag = -1;//标志
double x,y;//坐标
double h,l;//长宽
};
#endif // DIALOGIO_H
dialog.cpp:
#include "dialogio.h"
#include "ui_dialogio.h"
#include <QPen>
#include <QBrush>
DialogIO::DialogIO(QWidget *parent) :
QDialog(parent),
ui(new Ui::DialogIO)
{
ui->setupUi(this);
//tag=1; //标志等于1时绘制一条线
//repaint(x =50,y=100,l=20,h=50); //可以这样调用绘图函数
tag=2; //标志等于2时绘制一个矩形
repaint(x =200,y=300,l=100,h=160); //不使用这个也行,此只是为了方便我们多次调用。 painterEvent函数会自动调用。
}
DialogIO::~DialogIO()
{
delete ui;
}
void DialogIO::paintEvent(QPaintEvent *event)
{
QPainter painter(this);//使用前先创建一个qpainter画图对象
QPen pen; //画图对象有了没有🖊笔怎么画,所以要创建一个画笔
/*
* 画笔画出来的效果参数:
* 实线:Qt::SolidLine
* 各种虚线:Qt::DashLine,Qt::DotLine,Qt::DashDotLine,Qt::DashDotDotLine,Qt::CustomDashLine
*/
//设置画笔的各种属性:样式,宽度,颜色等
pen.setStyle(Qt::SolidLine);
pen.setWidth(3);
pen.setBrush(Qt::black );
/*端点风格参数:
* Qt::FlatCap
* Qt::SqureCap
* Qt::RoundCap
*/
pen.setCapStyle(Qt::RoundCap);
/*连接风格参数:
* Qt::MiterJoin
* Qt::BevelJoin
* Qt::RoundJoin
*/
pen.setJoinStyle(Qt::RoundJoin);
painter.setPen(pen); //painter绑定pen
//新建一个画刷(涂色) //绘制的图形有封闭空间的话就会在封闭空间图上brush的setcolor的颜色。
QBrush brush;
/*涂色的风格,参数太多,挑了几个:
* 纯色:Qt::SolidPattern
* 点状:Qt::Dense2Pattern
* 左斜线:Qt::BDiagPattern
* 右斜线:Qt::FDiagPattern
* 正网格:Qt::CrossPattern
* 斜网格:Qt::DiagCrossPattern
*/
brush.setStyle(Qt::SolidPattern);
brush.setColor(Qt::red);
painter.setBrush(brush); //painter绑定brush //设置画刷有效
//现在就可以随便画了
if(tag==1)
{
painter.drawLine(x,y,l,h);
}
else if(tag==2)
{
painter.drawRect(x,y,l,h);
}
}
运行效果:
。