Qt 实现圆盘时钟

转自https://blog.csdn.net/Mr_robot_strange/article/details/104982649

要写一个时钟,就从网上找到了一个,看了代码后,终于理解了实现思路,

画圆形表盘,画刻度线,画指针,画数字。

DiskClock::DiskClock(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::DiskClock)
{
    Qt::WindowFlags flags = 0;//this->windowFlags();

#ifndef _DEBUG_
//    flags |= Qt::WindowStaysOnTopHint;
#endif
    flags |= Qt::CustomizeWindowHint;
    flags |= Qt::FramelessWindowHint;

    setWindowFlags(flags);//支掉widget的标题栏
    setAttribute(Qt::WA_TranslucentBackground);//背景透明
//    ui->setupUi(this);
    startTimer(1000,Qt::PreciseTimer);

}

DiskClock::~DiskClock()
{
    delete ui;
}
void DiskClock::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);//设置抗锯齿
    Draw_Clock(&painter);
}

void DiskClock::Draw_Clock(QPainter *painter)
{
    Init_Parameter();
    Set_Mask(painter);

    Draw_Broad(painter);
    Draw_Dial(painter);
    Draw_Text(painter);
    Draw_Pointer(painter);
}

void DiskClock::Init_Parameter()
{
    Center_pos = QPoint(this->width()/2,this->height()/2);//以窗体中心为圆心
    R_Edge = this->height()/2;//以窗体高度的一半为半径
    R_Inside = R_Edge-R_Edge/10;
    Div_Max = 12;
    Div_Min = 5;
    BaseAngle = 270;
    R_Center = 15;
    R_Pointer = 6;
    QTime Time = QTime::currentTime();//获取当前系统时间

    H=Time.hour();//分别设置时、分、秒
    M=Time.minute();
    S=Time.second();
}

void DiskClock::Set_Mask(QPainter *painter)
{
    painter->save();//保存

//    QBrush brush = QBrush(Qt::transparent);//设置画刷为透明
//    painter->setBrush(brush);
//    painter->fillRect(this->rect(),QColor(0,0,0,0));

    painter->restore();//恢复
}

void DiskClock::Draw_Broad(QPainter *painter)
{
    painter->save();

    QBrush brush = QBrush(Color_Edge);//绘制外部圆
    painter->setBrush(brush);
    painter->drawEllipse(Center_pos,R_Edge,R_Edge);

    brush = QBrush(Color_Inside);//绘制内部圆
    painter->setBrush(brush);
    painter->drawEllipse(Center_pos,R_Inside,R_Inside);

    brush = QBrush(Color_Center);//绘制中心小圆
    painter->setBrush(brush);
    painter->drawEllipse(Center_pos,R_Center,R_Center);

    painter->restore();
}

void DiskClock::Draw_Dial(QPainter *painter)
{
    painter->save();

    for(int Loop = 0; Loop <= Div_Max*Div_Min; Loop++)
    {
        float Angle = BaseAngle + (360 / (Div_Max * Div_Min))*Loop;//从基础仰角BaseAngle 270度开始绘制的每条刻度线对应的角度,共12*5个刻度
        int R = R_Inside-1;
        int x_start = Center_pos.x() + R * cos((Angle / 180) * PI);//原来sin,cos函数用的参数是弧度,所以要换算

弧度制与角度制的换算公式:1度=π/180≈0.01745弧度,1弧度=180/π≈57.3度。角的度量单位通常有两种,一种是角度制,另一种就是弧度制。

1弧度=180/pai 度

1度=pai/180 弧度

记不住的时候就像圆

一个圆是360度,2pai弧度


        int y_start = Center_pos.y() + R * sin((Angle / 180) * PI);

        if(Loop % Div_Min == 0)//判断是否为大刻度
        {
            QPen pen(Qt::black);
            pen.setWidth(4);
            painter->setPen(pen);
            R = R_Inside-20;
        }
        else  //判断是否为小刻度
        {
            QPen pen(Qt::black);
            pen.setWidth(2);
            painter->setPen(pen);
            R = R_Inside-15;
        }

        int x_end = Center_pos.x() + R * cos((Angle / 180) * PI);
        int y_end = Center_pos.y() + R * sin((Angle / 180) * PI);

        painter->drawLine(QPoint(x_start,y_start),QPoint(x_end,y_end));//绘制刻度线
    }


    painter->restore();
}

void DiskClock::Draw_Text(QPainter *painter)
{
    painter->save();

    QPen qPen(Qt::black);
    qPen.setWidth(5);   //设置画笔的粗细
    painter->setPen(qPen);
    QFont qFont("楷体",this->width()/20,QFont::Bold,false);
    painter->setFont(qFont);

    int Dial_Text = 12;
    for(int Loop = 0;Loop < Div_Max;Loop++)
    {
        if(Dial_Text >12 )
            Dial_Text = 1;
        int R = R_Inside*0.7;
        float Angle = BaseAngle + (360 / Div_Max )*Loop;
        int x = Center_pos.x() + R * cos((Angle / 180) * PI);
        int y = Center_pos.y() + R * sin((Angle / 180) * PI);
//        x += R*0.2;
//        y += R*0.2;
        painter->drawText(QRect(x-R*0.15,y-R*0.15,R*0.25,R*0.25),Qt::AlignCenter,QString::number(Dial_Text++));
//        painter->drawRect(QRect(x-R*0.1,y-R*0.1,R*0.2,R*0.2));
//        painter->drawLine(Center_pos,QPoint(x,y));
    }
//    painter->drawText(Center_pos.x()-60,Center_pos.y()+60,"劳力士");


    painter->restore();
}

void DiskClock::Draw_Pointer(QPainter *painter)
{
    painter->save();

    QBrush qBrush = QBrush(QColor(Qt::black));
    painter->setBrush(qBrush);
    QPen qPen(Qt::black);
    qPen.setWidth(2);   //设置画笔的粗细
    painter->setPen(qPen);
//**********绘制秒针***********************************************************************************
    float Angle = BaseAngle + (360 / (Div_Max * Div_Min))*S;
    float RightAngle = Angle + 90;//右侧角度
    float LeftAngle = Angle - 90;//左侧角度
    int R = R_Inside-1;
    int x_start = Center_pos.x() + R * cos((Angle / 180) * PI);
    int y_start = Center_pos.y() + R * sin((Angle / 180) * PI);

    R = R_Pointer-1;
    int x_end1 = Center_pos.x() + R * cos(RightAngle * 3.14 / 180);//过圆心的右侧切点
    int y_end1 = Center_pos.y() + R * sin(RightAngle * 3.14 / 180);
    int x_end2 = Center_pos.x() + R * cos(LeftAngle * 3.14 / 180);//过圆心的左侧切点
    int y_end2 = Center_pos.y() + R * sin(LeftAngle * 3.14 / 180);

    QPointF qTriangle_S[3] = {QPoint(x_start,y_start),QPoint(x_end1,y_end1),QPoint(x_end2,y_end2)};
    painter->drawPolygon(qTriangle_S,3);
//**********绘制分针***********************************************************************************
    Angle = BaseAngle + (360 / (Div_Max * Div_Min))*M;
    RightAngle = Angle + 90;//右侧角度
    LeftAngle = Angle - 90;//左侧角度
    R = R_Inside-60;
    x_start = Center_pos.x() + R * cos((Angle / 180) * PI);
    y_start = Center_pos.y() + R * sin((Angle / 180) * PI);

    R = R_Pointer-1;
    x_end1 = Center_pos.x() + R * cos(RightAngle * 3.14 / 180);//过圆心的右侧切点
    y_end1 = Center_pos.y() + R * sin(RightAngle * 3.14 / 180);
    x_end2 = Center_pos.x() + R * cos(LeftAngle * 3.14 / 180);//过圆心的左侧切点
    y_end2 = Center_pos.y() + R * sin(LeftAngle * 3.14 / 180);

    QPointF qTriangle_M[3] = {QPoint(x_start,y_start),QPoint(x_end1,y_end1),QPoint(x_end2,y_end2)};
    painter->drawPolygon(qTriangle_M,3);
//**********绘制时针***********************************************************************************
    Angle = BaseAngle + (360 / Div_Max)*H;
    RightAngle = Angle + 90;//右侧角度
    LeftAngle = Angle - 90;//左侧角度
    R = R_Inside-120;
    x_start = Center_pos.x() + R * cos((Angle / 180) * PI);
    y_start = Center_pos.y() + R * sin((Angle / 180) * PI);

    R = R_Pointer-1;
    x_end1 = Center_pos.x() + R * cos(RightAngle * 3.14 / 180);//过圆心的右侧切点
    y_end1 = Center_pos.y() + R * sin(RightAngle * 3.14 / 180);
    x_end2 = Center_pos.x() + R * cos(LeftAngle * 3.14 / 180);//过圆心的左侧切点
    y_end2 = Center_pos.y() + R * sin(LeftAngle * 3.14 / 180);

    QPointF qTriangle_H[3] = {QPoint(x_start,y_start),QPoint(x_end1,y_end1),QPoint(x_end2,y_end2)};
    painter->drawPolygon(qTriangle_H,3);

    painter->restore();
}
void DiskClock::timerEvent(QTimerEvent *event)
{
    update();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt实现可调时钟和整点报时可以通过以下步骤进行: 1. 创建一个Qt应用程序,并添加一个QLabel控件用于显示时间。 2. 使用QTimer类来定时更新时间,并将其连接到一个槽函数。 3. 在槽函数中获取当前时间,并将其显示在QLabel控件中。 4. 使用QMediaPlayer类来播放整点报时的音频文件。 5. 在每个整点时刻,触发播放音频的操作。 下面是一个简单的示例代码: ```cpp #include <QtWidgets> #include <QMediaPlayer> class ClockWidget : public QWidget { Q_OBJECT public: ClockWidget(QWidget *parent = nullptr) : QWidget(parent) { // 创建显示时间的标签 timeLabel = new QLabel(this); timeLabel->setAlignment(Qt::AlignCenter); timeLabel->setFont(QFont("Arial", 24)); // 创建定时器 QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, this, &ClockWidget::updateTime); timer->start(1000); // 每秒更新一次时间 // 创建媒体播放器 mediaPlayer = new QMediaPlayer(this); // 设置布局 QVBoxLayout *layout = new QVBoxLayout(this); layout->addWidget(timeLabel); setLayout(layout); } private slots: void updateTime() { // 获取当前时间 QDateTime currentTime = QDateTime::currentDateTime(); QString timeString = currentTime.toString("hh:mm:ss"); // 显示时间 timeLabel->setText(timeString); // 整点报时 if (currentTime.time().minute() == 0 && currentTime.time().second() == 0) { playChimeSound(); } } void playChimeSound() { // 播放整点报时的音频文件 mediaPlayer->setMedia(QUrl::fromLocalFile("chime.wav")); mediaPlayer->play(); } private: QLabel *timeLabel; QMediaPlayer *mediaPlayer; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); ClockWidget clockWidget; clockWidget.show(); return app.exec(); } ``` 这个示例代码创建了一个可调时钟Qt应用程序,每秒钟更新一次时间,并在整点时刻播放报时音频文件。你可以根据自己的需求修改代码和音频文件路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值