溫馨提示×

溫馨提示×

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

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

Qt時鐘界面

發(fā)布時間:2020-07-18 22:49:31 來源:網(wǎng)絡(luò) 閱讀:1353 作者:小溢 欄目:編程語言

參考網(wǎng)上的代碼,

直接附上源碼

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);//字體大小設(shè)置為10
    setFont(font);
}

CLOCK::~CLOCK()
{

}

void CLOCK::paintEvent(QPaintEvent * /* event */)
{
    //下面三個數(shù)組用來定義表針的三個頂點,以便后面的填充
    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();   //獲取當(dāng)前的時間
    QPainter painter(this);              //聲明用來繪圖用的painter

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

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

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

    painter.setPen(hourColor);    //下面畫表示小時的刻度,此時要用到畫筆(因為要劃線)
    for (int i = 0; i < 12; ++i) {
        painter.drawLine(0, -88, 0, -96);     //寫上刻度數(shù)字
        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);
    }
    //后面的跟前面的類似,分別繪制了分針和秒針,及相應(yīng)的刻度
    painter.setPen(Qt::NoPen);
    painter.setBrush(minuteColor);
    painter.save();
    painter.rotate(6.0 * (time.minute() + time.second() / 60.0));  //設(shè)旋轉(zhuǎn)(角度 = 6° * (分鐘 + 秒 / 60))
    painter.drawConvexPolygon(minuteHand, 3);  //填充分針部分
    painter.restore();

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

    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);//設(shè)置刻度線為粗黑
    QPen thinPen(palette().foreground(), 0.5);//設(shè)置刻度線為灰

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

    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();//復(fù)位之前的坐標系

    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);//坐標軸旋轉(zhuǎn)30度
// painter->drawLine(0,-98,0,-88);
// }
    /*畫刻度還有數(shù)字*/
    for (int i = 1; i >= 60; ++i) {
        painter->save();
        painter->rotate(6*i);//坐標軸旋轉(zhuǎn)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槽函數(shù),每當(dāng)定時器時間到了1秒后,給出定時器溢出信號,觸發(fā)update槽函數(shù),該函數(shù)自動調(diào)用

paintEvent(QPaintEvent * /* event */)

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

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI