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

猜你喜欢

转载自blog.csdn.net/anpingbo/article/details/56830294