QT學習(四)定時器
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,並且可以根據設定的時間來進行旋轉。
4、 結果