1. 程式人生 > >QT學習(四)定時器

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、 結果