文章目录
一.Qt中基本绘图事件的简介
1.样例展示
2.基本思路
1.第一张图是绘制直线、矩形(正方形)、椭圆(圆)、正多边形以及文本。基本原理是建立了一个以左上角为原点,水平向右为x轴,竖直向下为y轴的虚拟笛卡尔坐标系。如此以来,代码中的各参数意义也就比较容易理解了。
2.特别强调一下多边形的原理,以对话框左顶角为原点,建立虚拟的笛卡尔坐标系。然后通过数组定义出六个点,循环给出这些点的坐标,最后将点连接起来,就是正六边形。(如果要绘制N边形,就要定义N个点)
3.第二张图是背景的设计,在之后的一篇文章中关于时钟框的设置会用到。
3.关键代码
void Dialog::paintEvent(QPaintEvent *event)
{
QPainter painter(this);//代表在对话框里绘图
//绘制直线,参数分别表示,起点和终点的坐标
painter.drawLine(0,0,200,200);
//绘制矩形,前两个参数表示起始点坐标,后面表示矩形的高和宽
painter.drawRect(100,200,100,100);
//绘制椭圆,注意:前两个参数不是中心点,而是平行于上顶点的直线和平行左顶点的直线的交点
painter.drawEllipse(100,200,100,100);
//绘制多边形
int N=6;
QPoint* points=new QPoint[N];
for(int i=0;i<N;i++)
{
double x=200+200*cos(2*M_PI/N*i);
double y=200+200*sin(2*M_PI/N*i);
points[i]=QPoint(x,y);
}
painter.drawPolygon(points,6);
//绘制文本
painter.drawText(100,100,"123456");
//第二张图的内容,效果是将资源文件里的图片铺满对话框
QPixmap map(":/res/123.jpg");
QRect q(0,0,3840,2160);
QRect q2(0,0,width(),height());
painter.drawPixmap(q2,map,q);
}
二.利用时间触发事件实现多幅图片连成动图
1.样例展示
2.基本思路
1.将动图分为多幅不同时刻的图片,将这些图片按照一定时间顺序利用时间触发事件和绘图事件打印出来,效果就是动图的效果。
2.关键函数:startTimer()函数,使用事件函数参数类调用void timerEvent()函数。完成计时器事件的打印。
3.循环的原理:通过提前编制图片的名称编号,然后根据编号来循环调出图片。实现函数为QString中的arg函数。具体用法附在代码中。
3.关键代码
1.头文件中:
void paintEvent(QPaintEvent * event);
void timerEvent(QTimerEvent * event);
int curIndex;
void Initpixmap();
//在头文件中给出函数和变量的声明
2.源文件中的事件函数:
void Dialog::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QRect q(0,0,658,494);
QRect q2(0,0,658,494);
painter.drawPixmap(q2,pixmap[curIndex],q);
}
3.源文件中的计时器函数:
void Dialog::timerEvent(QTimerEvent *event)
{
curIndex++;
if(curIndex>=16)
curIndex=0;
repaint();
//重置计时器,使图片能够不断打印
}
4.源文件中的图片填入函数:
void Dialog::Initpixmap()
{
for(int i=0;i<16;i++)
{
QString fileName=QString(":/res/IMG000%1.bmp").arg(i+1,2,10,QLatin1Char('0'));
//arg函数中的四个参数分别代指:图片编号(由于上面有一张背景图,所以这里+1)、编号的位数、进制数、空余位置默认填充值。
QPixmap map(fileName);
pixmap[i]=map;
}
}
三.如何分别控制多个计时器运行
1.基本思路
关键思路是对计时器进行特定化——编号,然后将事件函数与特定的计时器连接起来。
2.关键代码
首先还是在头文件中定义编号变量
int eventID1;
int eventID2;
在事件函数中增加条件函数:
if(event->timerID()==eventID1)
{
static int i=0;
i++;
ui->label->setText(QString::number(i));
}
以上就是第二次课的基本内容,感谢大家的浏览,如果有错误,请不吝赐教。