简单说说,Qt时钟的多种实现方式

鱼弦
全栈领域优质创作者
博客专家认证
2023-08-03 09:19:36

一 电子时钟:时:分:秒

 

下面是使用PyQt实现时钟的示例代码:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel
from PyQt5.QtCore import Qt, QTimer, QTime

class Clock(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        vbox = QVBoxLayout()

        self.timeLabel = QLabel(self)
        self.timeLabel.setAlignment(Qt.AlignCenter)
        vbox.addWidget(self.timeLabel)

        self.setLayout(vbox)

        timer = QTimer(self)
        timer.timeout.connect(self.showTime)
        timer.start(1000)

        self.showTime()

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Clock')
        self.show()

    def showTime(self):
        time = QTime.currentTime()
        text = time.toString('hh:mm:ss')
        self.timeLabel.setText(text)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    clock = Clock()
    sys.exit(app.exec_())

这个示例代码中,我们创建了一个名为Clock的窗口类,该类继承自QWidget

Clock类中,我们创建了一个QVBoxLayout垂直布局,并在其中添加了一个QLabel标签。

我们还使用QTimer定时器来更新时钟的时间,并在每次更新时调用showTime方法,该方法将当前时间转换为指定格式的字符串,并将其设置为QLabel的文本内容。

在主函数中,我们创建了一个QApplication实例,并实例化了Clock类的对象,然后调用app.exec_()方法运行应用程序。

二 图形时钟

下面是使用PyQt实现带有时针、分针和秒针的圆形时钟的示例代码:

import sys
import math
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QBrush, QPen, QColor
from PyQt5.QtCore import Qt, QTimer, QPoint, QRectF, QTime

class Clock(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        timer = QTimer(self)
        timer.timeout.connect(self.update)
        timer.start(1000)

        self.setGeometry(300, 300, 250, 250)
        self.setWindowTitle('Clock')
        self.show()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        side = min(self.width(), self.height())
        painter.setViewport((self.width() - side) // 2, (self.height() - side) // 2, side, side)
        painter.setWindow(-50, -50, 100, 100)

        # 绘制表盘
        brush = QBrush(QColor(255, 255, 255))
        painter.setBrush(brush)
        pen = QPen(QColor(0, 0, 0))
        pen.setWidth(2)
        painter.setPen(pen)
        painter.drawEllipse(-45, -45, 90, 90)

        # 绘制刻度
        for i in range(60):
            angle = math.pi * 2 / 60 * i
            inner_radius = 40 if i % 5 == 0 else 42
            outer_radius = 45
            x1 = int(math.sin(angle) * inner_radius)
            y1 = int(-math.cos(angle) * inner_radius)
            x2 = int(math.sin(angle) * outer_radius)
            y2 = int(-math.cos(angle) * outer_radius)
            painter.drawLine(QPoint(x1, y1), QPoint(x2, y2))

        # 获取当前时间并计算指针的位置
        time = QTime.currentTime()
        hour = time.hour()
        minute = time.minute()
        second = time.second()
        hour_angle = (hour % 12 + minute / 60) * 30
        minute_angle = minute * 6
        second_angle = second * 6

        # 绘制时针
        painter.save()
        painter.rotate(hour_angle)
        pen.setWidth(4)
        painter.setPen(pen)
        painter.drawLine(0, 0, 0, -20)
        painter.restore()

        # 绘制分针
        painter.save()
        painter.rotate(minute_angle)
        pen.setWidth(3)
        painter.setPen(pen)
        painter.drawLine(0, 0, 0, -30)
        painter.restore()

        # 绘制秒针
        painter.save()
        painter.rotate(second_angle)
        pen.setWidth(2)
        painter.setPen(pen)
        painter.drawLine(0, 0, 0, -40)
        painter.restore()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    clock = Clock()
    sys.exit(app.exec_())

在这个示例代码中,我们创建了一个名为Clock的窗口类,该类继承自QWidget

Clock类中,我们使用QTimer定时器来更新时钟的时间,并在每次更新时调用paintEvent方法,该方法绘制了一个圆形表盘和三个指针。

paintEvent方法中,我们首先设置了绘图器的视口和窗口,以确保表盘的大小适合窗口大小。

然后,我们使用QPainter绘制了表盘和刻度。

接下来,我们获取当前时间并计算时针、分针和秒针的角度,然后使用QPainter绘制三个指针。

在每个指针的绘制过程中,我们使用painter.save()painter.restore()方法保存和还原绘图器的状态,以确保不会影响到其他元素。

当我们运行这个代码时,将会看到一个带有时针、分针和秒针的圆形时钟。

pyQt 实现相对比C++ 的实现要简便很多,如果要翻译成C++版本的也很简单,大家可以试试。

 

 

 

...全文
307 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

125

社区成员

发帖
与我相关
我的任务
社区描述
全栈技术社区,指在创建一个和谐的技术群体,共同学习进步
qt前端tcp/ip 个人社区 四川省·成都市
社区管理员
  • 鱼弦
  • M malloc
  • 恰柠
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧