时间:2021-08-19 09:48:25 | 栏目:C代码 | 点击:次
本文实例为大家分享了Qt实现指针式时钟、动态时钟的具体代码,供大家参考,具体内容如下
先上图:
点击运行后首先是一个指针式时钟窗口,点击Digital Clock->可以跳转到数字时钟窗口,再点击Move Clock->可以还原为指针式时钟窗口
关于整个程序的讲解都在代码注释中给出,很详细~
概要:
我设计两个窗口,一个主窗口一个子窗口,利用按钮+信号与槽机制,实现两个窗口的互相切换,其中主窗口用来显示指针时钟,完成三个基本要求:
1、正确显示系统时钟;
2、能准确定位时钟刻度和时分秒针的位置;
3、能随窗口大小的变化而变化;
关于主窗口的实现,首先利用Qt自带的时间函数QTime::currentTime()获取系统时间,然后利用paintEvent(QPaintEvent *)函数根据获取到的系统时间进行时针,分针,秒针的绘画,并且画出对应的小时刻度线,分钟刻度线,秒刻 度线,实现基本时钟的样式,最后加入scale()函数进行相应的比例缩放,实现时钟能随窗口的大小变化而变化;
关于子窗口,是我自己多加入的模块,是一个电子时钟,用一个lcd液晶显示器以”时:分:秒”的格式显示当下时间,同样是利用自带的时间函数QTime::currentTime()获取当前时间并通过lcd显示。最后将两个窗口通过两个按钮连接起来,实现互相切换功能。
mainwindow.h(主窗口)
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include<QLCDNumber> #include<QLabel> #include<sub.h> #include<QPushButton> QT_BEGIN_NAMESPACE QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr);//构造函数 ~MainWindow();//析构函数 void paintEvent(QPaintEvent *);//画时钟函数 public: void dealsub();//转换为子窗口 void changeback();//转换为主窗口 private: sub w;//子窗口 QPushButton b;//按钮 }; #endif // MAINWINDOW_H
mainwindow.cpp(主窗口)
#include "mainwindow.h" #include "ui_mainwindow.h" #include<QPainter> #include<QPen> #include<QTime> #include<QTimer> #include<QLabel> #include<QPushButton> #include<QLCDNumber> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowIcon(QIcon(":/new/prefix1/v2-d858191577356128b31c88e186eea0db_r.jpg"));//设置图标 QTimer *timer = new QTimer(this);//产生一个定时器 connect(timer, SIGNAL(timeout()), this, SLOT(update()));//关联定时器的信号与槽 timer->start(1000);//开始定时器,每一秒钟更新一次 resize(600,600);//窗口大小 b.setParent(this);//指定按钮父对象 b.setGeometry(0,0,160,40);//设置按钮位置 b.setText("Digital clock->");//设置按钮内容 b.setStyleSheet("QPushButton{background-color: rgba(205,214,216,0);color:rgb(0,0,0);}");//设置按钮样式,rgba前三个参数同rgb,最后一个参数表示不透明度,0~1之间 connect(&b,&QPushButton::released,this,&MainWindow::dealsub);//鼠标松开时触发,跳转到处理子窗口函数 void(sub::*funsignal)()=&sub::mysignal; connect(&w,funsignal,this,&MainWindow::changeback);//关联信号与槽,实现从子窗口返回到主窗口 } MainWindow::~MainWindow() { } void MainWindow::paintEvent(QPaintEvent *) { static const QPoint hour[3] = { QPoint(14, 15), QPoint(-14, 15), QPoint(0, -110) }; static const QPoint minute[3] = { QPoint(11, 13), QPoint(-11, 13), QPoint(0, -170) }; static const QPoint second[3] = { QPoint(7, 8), QPoint(-7, 8), QPoint(0, -210) }; int size=qMin(width(),height()); QTime time=QTime::currentTime();//获取系统当前时间 QPainter p(this);//创建画家对象 p.setRenderHint(QPainter::Antialiasing);//防止图形走样 p.translate(width()/2,height()/2);//平移坐标系置中心 p.scale(size/600.0,size/600.0);//缩放 QBrush brush;//定义画刷 brush.setColor(QColor(245,182,96));//设置画刷颜色 brush.setStyle(Qt::SolidPattern);//设置样式 QPen pen;//定义画笔 pen.setWidth(18);//设置画笔宽度 pen.setColor(QColor(205,214,216));//rgb设置颜色 pen.setStyle(Qt::SolidLine);//设置风格 p.setPen(pen);//将画笔交给画家 p.drawEllipse(QPoint(0,0),280,280);//画圆 pen.setColor(Qt::white); pen.setWidth(160);//设置画笔宽度 p.setPen(pen);//将画笔交给画家 p.drawEllipse(QPoint(0,0),160,160);//画圆 //画时针 p.setBrush(brush);//将画刷交给画家 p.setPen(Qt::NoPen); p.save();//保存当下状态 p.rotate(30.0*(time.hour()+time.minute()/60.0));//图形旋转,以原点为旋转中心,顺时针水平旋转对应时针的角度 p.drawConvexPolygon(hour,3);//画时针这个凸多边形,第一个参数为所有的点,第二个参数为点的个数 p.restore();//恢复上一次保存的结果,和save()成对出现 //绘制小时线 pen.setStyle(Qt::SolidLine); pen.setWidth(5); pen.setColor(Qt::black); p.setPen(pen); for(int i=0;i<12;i++) { p.drawLine(0,268,0,276);//画小时线 p.drawText(-5,-235,QString::number(i));//表明小时数 p.rotate(30);//每画一次旋转30度 } //画分针 p.setPen(Qt::NoPen); p.setBrush(QColor(144,199,247)); p.save();//保存当下状态 p.rotate(6.0*(time.minute()+time.second()/60.0));//顺时针旋转至分针的位置 p.drawConvexPolygon(minute,3);//画分针这个凸多边形,第一个参数为所有的点,第二个参数为点的个数 p.restore();//恢复上一次保存的结果,和save()成对出现 //绘制分钟线 pen.setStyle(Qt::SolidLine); pen.setColor(QColor(0,0,0)); pen.setWidth(1); p.setPen(pen); for(int i=0;i<60;i++) { if((i%5)!=0) p.drawLine(0,265,0,276);//5的倍数时不画,因为有小时线 p.rotate(6);//每画一次旋转6度 } //画秒线 p.setPen(Qt::NoPen); p.setBrush(QColor(119,217,175)); p.save(); p.rotate(6*time.second());//顺时针旋转至秒针的位置 p.drawConvexPolygon(second, 3);//画秒针这个凸多边形,第一个参数为所有的点,第二个参数为点的个数 p.restore(); //画圆心 p.setBrush(Qt::black); p.setPen(Qt::white); p.save(); p.drawEllipse(QPoint(0,0),3,3);//画圆心 p.restore(); //表明上午还是下午 p.setPen(Qt::black); if(time.hour()>=12) p.drawText(-6,-50,"PM");//画文本区 else p.drawText(-6,-50,"AM");//画文本区 p.drawText(-60,-130,"Made By ZSR");//画文本区 } void MainWindow::dealsub() { w.show();//显示子窗口 this->hide();//主窗口隐藏 } void MainWindow::changeback() { w.hide();//子窗口隐藏 this->show();//显示主窗口L }
sub.h(子窗口)
#ifndef SUB_H #define SUB_H #include <QMainWindow> #include<QPushButton> #include<QLCDNumber> class sub : public QMainWindow { Q_OBJECT public: explicit sub(QWidget *parent = nullptr); void sentsignal();//发送信号 void paintEvent(QPaintEvent *event);//画电子时钟 signals://信号 void mysignal(); public slots://槽 void showtime();//显示时间函数 private: QPushButton b1;//按钮 QLCDNumber *lcd;//lcd }; #endif // SUB_H
sub.cpp(子窗口)
#include "sub.h" #include<QTime> #include<QTimer> #include<QLCDNumber> #include<QPainter> sub::sub(QWidget *parent) : QMainWindow(parent) { setWindowIcon(QIcon(":/new/prefix1/f56513788384645db768d0ec542dec33_r.jpg"));//设置图标 this->setWindowTitle("Digital clock");//设置窗口标题 this->resize(900,500);//设置窗口大小 b1.setParent(this);//指按钮定父对象 b1.setText("Move clock->");//设置按钮内容 b1.setGeometry(0,0,140,40);//设置按钮位置 b1.setStyleSheet("QPushButton{background-color: rgba(205,214,216,0);color:rgb(0,0,0);}");//设置按钮风格 connect(&b1,&QPushButton::clicked,this,&sub::sentsignal);//连接信号与槽,当点击按钮的时候跳转到发送信号函数,主窗口接收,再执行changeback()函数,即实现了跳回主窗口 QTimer *timer1=new QTimer(this);////产生一个定时器 timer1->start(1000);//开始定时器,每一秒钟更新显示时间 connect(timer1,SIGNAL(timeout()),this,SLOT(showtime()));//关联定时器的信号与槽,1s到即更新显示时间 lcd=new QLCDNumber();//创建一个lcd液晶显示器 lcd->setSegmentStyle(QLCDNumber::Filled);//设置显示器风格 lcd->setParent(this);//指定显示器父对象 lcd->move(0,50);//移动显示器位置 lcd->setDigitCount(8);//设置所显示的位数为8位 lcd->resize(200,50);//设置显示器大小 showtime();//显示时间 } void sub::sentsignal()//发送信号 { emit mysignal(); } void sub::showtime() { QTime time1=QTime::currentTime();//获取当前时间 QString text=time1.toString("hh:mm:ss");//定义时间显示格式 if((time1.second()%2)==0) text[5]=' ';//每2s冒号消失一次 lcd->display(text);//lcd显示时间 } void sub::paintEvent(QPaintEvent *event)// { QPainter p(this);//创建一个画家对象 p.drawPixmap(rect(),QPixmap(":/new/prefix1/f8fa6c0b00b51e33e8949627d52942ea.jpg"));//设置背景图 }
main.cpp(主函数)
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w;//创建一个主窗口 w.setWindowTitle("Move clock");//设置主窗口标题 w.show();//显示主窗口 return a.exec(); }
THE END