Qt 入门 之 2D绘图

一、函数介绍

Qt 2D绘图所用到的函数:
void paintEvent(QPaintEvent *);
所有的进行图形绘制的函数都必须放在这个函数里面,它所带来的问题是,不能随时随地在程序的任何地方调用画图的函数,如果我想在这一个函数内调用下画圆的函数,在那一个函数里调用下画矩形的函数,这样做是不被允许的。不管是画圆还是画矩形的函数,都必须放在paintEvent函数内,那怎么在这个函数的外边画图呢,比如我想画个矩形,那么就在paintEvent函数中写一行绘制矩形的函数,其中的参数全部作为全局变量,想画图的时候就将这些全局变量更新一下,然后调用paintEvent()函数进行绘制。
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,不管系统怎么调用这个函数都没用,只是会清屏罢了,这个避免不了,因为系统调用这个函数的时候可没有设置重绘的范围,是全部都重绘的,如果没用重绘的具体语句,就相当于清屏了。

二、画图函数

头文件

#include 

如何使用

//建一个画图对象,无论是画笔还是画刷,都得用这个对象配置完之后才能用
QPainter painter(this);

//新建一个画笔
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);

//新建一个画刷(涂色的)
QBrush brush(Qt::FDiagPattern);

/*涂色的风格,参数太多,挑了几个:
纯色:Qt::SolidPattern
点状:Qt::Dense2Pattern
左斜线:Qt::BDiagPattern
右斜线:Qt::FDiagPattern
正网格:Qt::CrossPattern
斜网格:Qt::DiagCrossPattern
*/
brush.setStyle(Qt::SolidPattern);

//颜色
brush.setColor(Qt::red);

//配置画刷
painter.setBrush(brush);

//画图函数,配置画笔或画刷完成之后就可以画了

//直线
painter.drawLine(x1,y1,x2,y2);

//矩形的内切椭圆,(x,y)是矩形左上角坐标,l是长,h是高。椭圆或圆都是用这个函数
painter.drawEllipse(x,y,l,h);

//空心矩形
painter.drawRect(x,y,l,h);

三、使用模板

全局变量

int tag = -1;//标志
double x,y;//坐标
double h,l;//长宽

绘图函数

/* 初始值 tag = -1
tag的值对应想画的图形
*/
void Widget::paintEvent(QPaintEvent *){

    QPainter painter(this);
    if(tag == 0){
        //比如说画条线
    }
    else if(tag == 1){
        //画个圆
    }
    //else if(tag == )以此类推
}

调用绘图函数

//参数为矩形区域,x、y是坐标,l、h是长和宽
repaint(x,y,l,h);

你可能感兴趣的:(Qt)