溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt時鐘界面

發布時間:2020-07-18 22:49:31 來源:網絡 閱讀:1406 作者:小溢 欄目:編程語言

參考網上的代碼,

直接附上源碼

clock.cpp

#include "clock.h"
#include <QTime>
#include <QTimer>
#include <QPainter>
#include <QDebug>

CLOCK::CLOCK(QWidget *parent)
    : QWidget(parent)
{
    QTimer *timer = new QTimer(this);
    timer->start(1000);//一秒鐘
    connect(timer,SIGNAL(timeout()),this,SLOT(update()));

    QFont font;
    font.setPointSize(10);//字體大小設置為10
    setFont(font);
}

CLOCK::~CLOCK()
{

}

void CLOCK::paintEvent(QPaintEvent * /* event */)
{
    //下面三個數組用來定義表針的三個頂點,以便后面的填充
    static const QPoint hourHand[3] = {
        QPoint(3, 8),
        QPoint(-3, 8),
        QPoint(0, -40)
    };
    static const QPoint minuteHand[3] = {
        QPoint(3, 8),
        QPoint(-3, 8),
        QPoint(0, -70)
    };
    static const QPoint secondHand[3] = {
        QPoint(3, 8),
        QPoint(-3, 8),
        QPoint(0, -90)
    };//秒針
    //填充表針的顏色
    QColor hourColor(127, 0, 127);  //分針顏色(第四個表示不透明度)
    QColor minuteColor(0, 127, 127, 191);
    QColor secondColor(127, 127, 0, 127);

    int side = qMin(width(), height());  //繪制的范圍(寬、高中最小值)
    QTime time = QTime::currentTime();   //獲取當前的時間
    QPainter painter(this);              //聲明用來繪圖用的painter

    painter.setRenderHint(QPainter::Antialiasing);//繪制的圖像反鋸齒
    painter.translate(width() / 2, height() / 2);//重新定位坐標起始點,把坐標原點放到窗體的中央
    painter.scale(side / 300.0, side / 300.0);//設定畫布的邊界,用窗體寬高的最小值來計算時鐘的大小,防止窗體拉伸導致的時鐘變形以及顯示不全

    painter.setPen(Qt::red);   //填充時針,不需要邊線所以NoPen
    QString timeStr= QTime::currentTime().toString();     //繪制當前的時間
    painter.drawText(-40,30,80,30,Qt::AlignHCenter | Qt::AlignTop, timeStr);

    painter.setPen(Qt::NoPen);   //填充時針,不需要邊線所以NoPen
    painter.setBrush(hourColor);  //畫刷顏色設定
    painter.save();  //保存painter的狀態,保存的是當前的坐標狀態,如果不保存,畫完之后坐標以改變不方便畫下一個
    painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0))); //將painter(的”視角“)根據時間參數轉移(30° * (小時 + 分鐘 / 60))
    painter.drawConvexPolygon(hourHand, 3);  //填充時針的區域
    painter.restore();

    painter.setPen(hourColor);    //下面畫表示小時的刻度,此時要用到畫筆(因為要劃線)
    for (int i = 0; i < 12; ++i) {
        painter.drawLine(0, -88, 0, -96);     //寫上刻度數字
        if (i == 0)  painter.drawText(-10,-88,20,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(12));
        else  painter.drawText(-10,-88,20,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(i));
        painter.rotate(30.0);
    }
    //后面的跟前面的類似,分別繪制了分針和秒針,及相應的刻度
    painter.setPen(Qt::NoPen);
    painter.setBrush(minuteColor);
    painter.save();
    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));  //設旋轉(角度 = 6° * (分鐘 + 秒 / 60))
    painter.drawConvexPolygon(minuteHand, 3);  //填充分針部分
    painter.restore();

    painter.setPen(minuteColor);
    for (int j = 0; j < 60; ++j) {  //循環60次,繪制表盤(其實可以從1開始,到59,提高一點效率)
        if ((j % 5) != 0)           //判斷是否能被5整除(能被5整除表示是正點刻度,暫不繪制)
            painter.drawLine(0, -92, 0, -96);  //不是正點刻度,繪制長4個像素的直線
        painter.rotate(6.0);   //循環60次,每次旋轉6度,所以不用save和restore
    }
    painter.setPen(Qt::NoPen);   //填充分針,不需要邊線所以NoPen
    painter.setBrush(secondColor);
    painter.save();       //設置畫刷顏色
    painter.rotate(6.0 * time.second());  //設置旋轉(6° * 秒)
    painter.drawConvexPolygon(secondHand, 3);  //設置填充
    painter.restore();                        //恢復保存前狀態

    painter.setBrush(Qt::black);             //畫上中心原點
    painter.drawEllipse(QPoint(0,0),2,2);

    painter.setBrush(Qt::NoBrush);       //畫上外圓圈
    painter.setPen(Qt::black);
    painter.drawEllipse(QPoint(0,0),97,97);
}

void CLOCK::draw(QPainter *painter)
{
    QPen thickPen(palette().foreground(), 1.5);//設置刻度線為粗黑
    QPen thinPen(palette().foreground(), 0.5);//設置刻度線為灰

    QTime time = QTime::currentTime();
    painter->translate(100,100);//重新設定坐標原點

    painter->setRenderHint(QPainter::Antialiasing);//消鋸齒
    painter->setBrush(Qt::red);
    painter->setPen(Qt::red);
    painter->save();//保存坐標系,防止坐標系跑偏了
    painter->rotate(6.0*time.second());//注意是6.0,不是6
    //painter->drawConvexPolygon(sed,4);
    painter->restore();//復位之前的坐標系

    painter->setBrush(Qt::blue);
    painter->setPen(Qt::blue);
    painter->save();
    painter->rotate(6.0*(time.minute()+time.second()/60.0));
    //painter->drawConvexPolygon(min,4);
    painter->restore();

    painter->setBrush(Qt::black);
    painter->setPen(Qt::black);
    painter->save();
    painter->rotate(30.0*(time.hour()+time.minute()/60.0));
    //painter->drawConvexPolygon(hour,4);
    painter->restore();

// //painter->drawLine(0,-98,0,-88);
// for(int i=0;i<</FONT>12;i++)
// {
// painter->rotate(30);//坐標軸旋轉30度
// painter->drawLine(0,-98,0,-88);
// }
    /*畫刻度還有數字*/
    for (int i = 1; i >= 60; ++i) {
        painter->save();
        painter->rotate(6*i);//坐標軸旋轉6度
        if (i % 5 == 0) {
            painter->setPen(thickPen);
            painter->drawLine(0, -98, 0, -82);
            painter->drawText(-20, -82, 40, 40,
                              Qt::AlignHCenter | Qt::AlignTop,
                              QString::number(i/5));
        } else {
            painter->setPen(thinPen);
            painter->drawLine(0, -98, 0, -88);
        }
        //painter->rotate(-DegreesPerMinute);
        painter->restore();
    }
}

clock.h

#ifndef _CLOCK_H_
#define _CLOCK_H_
#include <QWidget>

class CLOCK : public QWidget
{
public:
    CLOCK(QWidget *parent = 0);
    ~CLOCK();
    void paintEvent(QPaintEvent * /* event */);
    void draw(QPainter *painter);

};


#endif // CLOCK_H


解釋,update槽函數,每當定時器時間到了1秒后,給出定時器溢出信號,觸發update槽函數,該函數自動調用

paintEvent(QPaintEvent * /* event */)

,paintEvent是一個虛函數,我只知道是繼承自QWidget。我們將其重寫,畫出時鐘,每秒溢出后,update槽函數都會調用一次這個函數。這個時鐘類可以直接使用。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女