1、时间设置
QT中的QTimer类是用于定时功能,通过调用start()函数和stop()函数可以实现定时开始和结束,当所定时间到,其会自动发射timeout()信号。
Timer::Timer(QWidget *parent)
: QWidget(parent)
{
finishTime=QDateTime::currentDateTime();
updateTimer=new QTimer(this);
connect(updateTimer, SIGNAL(timeout()), this, SLOT(update()));
finishTimer=new QTimer(this);
finishTimer->setSingleShot(true);
connect(finishTimer, SIGNAL(timeout()), this, SIGNAL(timeout()));
connect(finishTimer, SIGNAL(timeout()), updateTimer, SLOT(stop()));
QFont font;
font.setPointSize(8);
setFont(font);
}
finishTimer用于定时,其设置为只触发一次信号;updateTimer用于隔一段时间来更新画面。
void Timer::setDuration(int seconds){
int secs=qBound(0, seconds, MaxTime);
finishTime=QDateTime::currentDateTime().addSecs(secs);
if(secs>0){
updateTimer->start(Interval*1000);
finishTimer->start(secs*1000);
}
else{
updateTimer->stop();
finishTimer->stop();
}
}
finishTime用于传递设定的时间,最终将秒数求出传递给finishTimer。Duration()计算设定的秒数。
int Timer::duration() const
{
int seconds=QDateTime::currentDateTime().secsTo(finishTime);
if(seconds<0)
seconds=0;
return seconds;
}
2、事件操作
通过重构相关函数来响应事件,一旦事件发生即调用该函数。定时即通过鼠标事件来进行时间测量。
void Timer::mousePressEvent(QMouseEvent *event){
QPointF point=event->pos()-rect().center();
double theta=std::atan2(-point.x(),-point.y())*180/PI;
setDuration(duration()+ int(theta/degreesPersecond));
update();
}
通过鼠标所在坐标的弧度可以计算设置的时间。
void Timer::paintEvent(QPaintEvent *){
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
int side = qMin(width(), height());
painter.setViewport((width() - side) / 2, (height() - side) / 2,
side, side);
painter.setWindow(-50, -50, 100, 100);
draw(&painter);
}
以上是传递了绘图事件的参数的函数,当调用update()函数时,即调用该函数进行重新绘图。
3、绘图
QPainter:绘图类,包含了画笔设置、颜色设置等选项,通过调用相关函数实现。
QPen thickPen(palette().foreground(), 1.5);
QPen thinPen(palette().foreground(), 0.5);
QColor niceBlue(150, 150, 200);
QPen是画笔,可以设置颜色和宽度;QColor(R, G, B,),设置三基色。
painter->setPen(thinPen);
painter->setBrush(palette().foreground());
painter->drawPolygon(QPolygon(3, &triangle[0][0]));
通过sePen和seBrush来设置画笔以及画刷,画笔用于描绘基本形状,画刷用于渲染颜色。drawPolygon用于绘画多边形。
QRadialGradient haloGradient(0, 0, 20, 0, 0);
haloGradient.setColorAt(0.0, Qt::lightGray);
haloGradient.setColorAt(0.8, Qt::darkGray);
haloGradient.setColorAt(0.9, Qt::white);
haloGradient.setColorAt(1.0, Qt::black);
QRadiaGradient用于设置辐射状变化的颜色,通过seColorAt来进行设置。
painter->rotate(duration() * degreesPersecond);
painter->setBrush(knobGradient);
painter->setPen(thinPen);
painter->drawRoundRect(-7, -25, 14, 50, 99, 49);
for (int i = 0; i <= MaxTime/60; ++i) {
if (i % 5 == 0) {
painter->setPen(thickPen);
painter->drawLine(0, -41, 0, -44);
painter->drawText(-15, -41, 30, 30,
Qt::AlignHCenter | Qt::AlignTop,
QString::number(i));
} else {
painter->setPen(thinPen);
painter->drawLine(0, -42, 0, -44);
}
painter->rotate(-degreesPerMinute);
}
通过totate来旋转坐标系,绘图text,并且可以根据设定的时间来进行旋转。