Qt实现指针式时钟 Qt实现动态时钟

本文实例为大家分享了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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Qt编程实现小时钟

    Hello World! 学习编程语言的最简单最经典的小程序,当然Qt也不例外.在学习画图时,我觉得写个时钟小程序也是个比较好的开始.在之前的<Matlab及Java小时>一文中,我也从写时钟程序作为学习画图的开始.三者之间的不同点在于,matlab是通过while循环来进行重绘,Java和Qt事件来处理.实时显示时钟,都是通过改变指针与坐标轴的相对位置来实现的.前两者都是改变指针,而Qt是旋转坐标轴.具体代码如下: 1.widget.h文件 #ifndef WIDGET_H #define

  • Qt绘制简单时钟

    本文实例为大家分享了Qt绘制简单时钟的具体代码,供大家参考,具体内容如下 概述 (1)基本原理 利用简单的几何图形绘出表盘和指针,然后基于系统时间调整指针偏转角度达到模拟时钟的效果. 其中可以加上自己喜欢的背景资源,设计不同风格的时钟. (2)部分函数说明 ①调色和填充 painter.setBrush(Qt::red); //设置画刷,填充颜色(红色) painter.setPen(Qt::red); //设置画笔,外围轮廓颜色(红色) ②抗锯齿(减少图形外围锯齿状,使线条平滑) painte

  • PyQt5使用QTimer实现电子时钟

    本文用 PyQt5 的QTimer类的两种方式实现电子时钟,供大家参考,具体内容如下 [效果图] [知识点] QTimer类提供了定时器信号/槽和单触发定时器. 它在内部使用定时器事件来提供更通用的定时器. QTimer很容易使用:创建一个QTimer,使用start()来开始并且把它的timeout()连接到适当的槽.当这段时间过去了,它将会发射timeout()信号. [实现] 1.定时器信号/槽方式 class MyTimer(QWidget): def __init__(self, pa

  • Qt实现简易时钟

    本文实例为大家分享了Qt实现简易时钟展示的具体代码,供大家参考,具体内容如下 一.效果展示 简单实现时钟(圆盘+QLCDNumber),大小刻度,数字等. 二.实现 .pro QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 # The following define makes your compiler emit warnings if you use # any Qt featur

  • QTimer与QTime实现电子时钟

    本文实例为大家分享了QTimer与QTime实现电子时钟的具体代码,供大家参考,具体内容如下 使用QLCDNumber控件进行显示 QLCDNumber控件默认只显示5个字符,可以使用setDigitCount(int size)进行设置显示个数 使用Display(QString str) 设置显示内容 该函数拥有多个重载,字符 整型 浮点型都可以作为参数 效果图: 代码:头文件 #include <QLCDNumber> class NumClock : public QLCDNumber

  • Qt设计时钟效果

    作为一位Qt的初学者,也是一位编程的小白,我今天想教大家如何使用Qt来设计一个时钟. 首先,我们要学习如何绘图--QPainter类 QPainter通常在一个窗口的重绘事件(paint event)的处理函数paintEvent中进行绘制.QPainter类常用的功能有以下几类: 1)设置绘图工具.包括设置画笔(setPen),设置画刷(setBrush),设置字体(setFont)以及设置背景(setBackgroundMode). 2)绘制图形和文字,如图: QPainter部分画图函数的

  • QT实现简单时钟效果

    本文实例为大家分享了QT实现简单时钟效果的具体代码,供大家参考,具体内容如下 先上效果图: 预备知识: 一.钟表实现原理 设置定时器timer,每隔1000毫秒(即1s)发送timeout()信号到槽函数update(),重绘事件函数paintEvent(QPaintEventevent) 二.钟表的绘制方法 拆分钟表:表盘 数字 刻度线 指针 paintEvent(QPaintEventevent) 1.设置定时器,时间间隔为1000毫秒,并且将定时器时间与update函数关联为信号和槽,定时

  • Python+Pyqt实现简单GUI电子时钟

    本文实例为大家分享了Python+Pyqt实现简单GUI电子时钟的具体代码,供大家参考,具体内容如下 突发奇想想用GUI做一个简单的电子时钟界面,利用pyqt模块也很方便,代码如下: from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import QWidget,QApplication,QLCDNumber,QVBoxLayout,QMessageBox,QPushButton import sy

  • python+PyQT实现系统桌面时钟

    用Python + PyQT写的一个系统桌面时钟,刚学习Python,写的比较简陋,但是基本的功能还可以. 功能: ①窗体在应用程序最上层,不用但是打开其他应用后看不到时间 ②左键双击全屏,可以做小屏保使用,再次双击退出全屏. ③系统托盘图标,主要参考PyQt4源码目录中的PyQt4\examples\desktop\systray下的程序 ④鼠标右键,将程序最小化 使用时需要heart.svg放在源代码同级目录下,[文件可在PyQt4示例代码目录下PyQt4\examples\desktop\

  • Qt绘制时钟效果

    简述 QPainter 提供了 2D 绘图的常用操作,QTimer 提供了定时器功能,将两者相结合,可以做出很多的自定义特效绘制. 下面,来实现一个每天都要接触的东西 - 时钟.包含了常见的所有功能:时针.分针.秒针. 实现方式 由于时钟是妙级更新的,所以我们需要定时刷新,时钟本身则使用之前讲过的 QPainter 来进行绘制. 使用 QTimer 定时刷新,设置超时时间为 1000 毫秒(1 秒). 绘制时钟,通过 paintEvent() 实现,包括:时针.分针.秒针.及面板.表盘等. 绘制

随机推荐