Qt 的绘制,首先看Qt文档:
The common use of QPainter is inside a widget’s paint event: Construct and customize (e.g. set the pen or the brush) the painter. Then draw. Remember to destroy the QPainter object after drawing. For example:
大致意思如下:
Qt画家通常的用法是在一个部件事件中;构造和定制的。
void MainWindow::paintEvent(QPaintEvent *event)
{
//创建当前时间,在以后的时钟显示的时候,有用。
QTime time=QTime::currentTime();
QPainter painter(this);
//画一个从坐标90,90,开始的园,直径为180。
painter.setRenderHint(QPainter::Antialiasing,true);
painter.setBrush(QBrush(Qt::darkGray,Qt::SolidPattern));
painter.drawEllipse(90,90,180,180);
//创建一个锥形梯度,原点,焦点,都是180,180,-90代表向下的圆锥。
QRadialGradient radgrient(180,180,-90,180,180);
radgrient.setColorAt(0.0,Qt::darkGray);
radgrient.setColorAt(0.2,Qt::white);
radgrient.setColorAt(0.3,Qt::cyan);
radgrient.setColorAt(1.0,Qt::white);
//画一个从坐标100,100,开始的圆,直径为160,这样做是为了,让时钟外围有一个圆环包围。
仅仅是为了美观而已。
painter.setBrush(radgrient);
painter.drawEllipse(100,100,160,160);
//世界坐标转换,这样做的意思就是将坐标系建在180,180,的位置。这个时候这个点的实质的坐标是0,0.
painter.translate(180,180);
painter.save();
//开始绘制时针,分针,秒针的颜色。
参数以此为,red,green,blue,和透明度。
QColor hour(200,10,50,150);
QColor min(10,100,100,150);
QColor sec(10,10,200,150);
//绘制分针刻度线
for (int i=1;i<=60;i++)
{
//绘制5个像素点长度的刻度线
painter.drawLine(0,-80,0,-75); //这个时候可以看上面的世界坐标转换。圆心坐标180,180,为坐标系原点,
他的上方,和左边为负数,右边,和下面为整数。好好思考。应该可以理解
painter.rotate(6); //一分钟,或者一秒旋转6度。其实本质是坐标系旋转6度。
}
// painter.setPen(hour);
//绘制时针刻度线
for (int i=1;i<=60;i++)
{
if(i%5==0)
{
//绘制5个像素点长度的刻度线
painter.setPen(Qt::red|Qt::cyan);
painter.drawLine(0,-80,0,-70);
painter.rotate(30);
painter.setPen(Qt::red|Qt::blue);
//在-3,-60,的位置添加每个刻度代表的数字。其实位置应该是0,-60,为了美观,位置有些偏差。
//tr("%1").arg(i/5)这个函数,是将数字转换成个字符串,默认情况,是以10进制转换.具体看Qt文档
painter.drawText(-3,-60, tr("%1").arg(i/5));
}
}
painter.restore();
//绘制时针,分针,秒针的形状。四个坐标,那就是四边形。注意坐标一定要按顺序写,不然是一个不规则的形状。
QPoint handhour[4]={
QPoint(0,-40),
QPoint(3,0),
QPoint(0,6),
QPoint(-3,0),
};
QPoint handsec[4]={
QPoint(0,-60),
QPoint(3,0),
QPoint(0,6),
QPoint(-3,0),
};
QPoint handmin[4]={
QPoint(0,-50),
QPoint(3,0),
QPoint(0,6),
QPoint(-3,0),
};
//显示时针的位置
painter.setPen(Qt::NoPen);
painter.setBrush(hour);
painter.save();
painter.rotate(30.0*(time.hour()+time.minute()/60));
painter.drawConvexPolygon(handhour,4); //绘制多边形函数。
painter.restore();//切记旋转之后,一定要复位,不然,分针的旋转会在时针的基础上旋转。
//显示分针的位置
painter.setPen(Qt::NoPen);
painter.setBrush(min);
painter.save();
painter.rotate(6.0*(time.minute()+time.second()/60));
painter.drawConvexPolygon(handmin,4);
painter.restore();
//显示秒针位置
painter.setPen(Qt::NoPen);
painter.setBrush(sec);
painter.save();
painter.rotate(time.second()*6);
painter.drawConvexPolygon(handsec,4);
painter.restore();
}
主函数
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//设置一个定时器,超过1000毫秒时,发射timeout()信号,触发update()槽函数。进行时间更新
QTimer *time=new QTimer;
time->start(1000);
connect(time,SIGNAL(timeout()),this,SLOT(update()));
}
MainWindow::~MainWindow()
{
delete ui;
}