跳至正文
View Categories

1 min read

    主要内容 #

  1. 优化布局

完成效果 #

本节课程是万年历实现的第四节,完成本节课程,能实现合理布局万年历信息。

收获 #

学习完本节内容,我们会让标签显示的时间信息水平居中,并优化调整各个控件的位置和间隔。

1.优化布局 #

addStretch()函数用于在控件间添加伸缩量,本例中addStretch(1)在相邻两个控件间都加入1个伸缩量,
表示将窗口中除去控件以外的空白部分等分为2份,并按照所设置的顺序放入布局管理器中。以下就是本例代码:

from PyQt5.QtWidgets import QWidget, QCalendarWidget, QLabel, QApplication, QVBoxLayout, QPushButton
from PyQt5.QtCore import QDate, QDateTime, QTimer, Qt
import sys


class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        vbox = QVBoxLayout(self)  # 创建一个垂直盒布局
        cal = QCalendarWidget(self)  # 创建一个日历对象
        cal.setNavigationBarVisible(True)  # 设置导航条是否可见,True为可见
        cal.setFirstDayOfWeek(Qt.Monday)  # 设置周一为每周的第一天
        cal.setGridVisible(True)  # 显示网格线
        cal.setDateRange(QDate(1949, 1, 1), QDate(2049, 1, 1))  # 设置日历涵盖的日期范围,从1949.1.1-2049.1.1

        self.lbl = QLabel(self)  # 创建一个标签
        # setAlignment方法设置标签的对齐格式,Qt.AlignHCenter指定水平居中
        self.lbl.setAlignment(Qt.AlignHCenter)
        # 选择一个日期时,clicked的点击信号就触发了,与showdate槽函数相关联并传入QDate参数。
        cal.clicked[QDate].connect(self.showDate)

        self.lbl2 = QLabel(self)  # 再创建一个标签,显示当前的时分秒信息
        self.lbl2.setAlignment(Qt.AlignHCenter)  # 水平居中
        self.timer = QTimer(self)  # 创建一个定时器实例
        self.timer.timeout.connect(self.showTime)  # 计时结束时,触发timeout超时信号,并连接到槽函数showTime
        vbox.addWidget(self.lbl2)  # 将标签添加到布局中
        vbox.addStretch(1)  # 添加一个伸缩量
        vbox.addWidget(cal)  # 将日历添加到布局中
        vbox.addStretch(1)  # 添加一个伸缩量
        vbox.addWidget(self.lbl)  # 将标签添加到布局中
        self.timer.start(1000)  # 启动计时器,并设置超时时间为1000毫秒也即1秒
        self.setGeometry(300, 300, 500, 330)
        self.setWindowTitle('Calendar')
        self.show()

    def showDate(self, date):
        # 获取选中的日期,然后把日期对象转成字符串,在标签里面显示出来
        self.lbl.setText(date.toString())

    def showTime(self):
        # QDateTime.currentDateTime()能获取当前时间
        time = QDateTime.currentDateTime()
        # toString()方法将当前时间按指定格式转换为字符串
        # yyyy/MM/dd 分别对应年月日,HH:mm:ss分别对应时分秒,dddd表示星期
        self.lbl2.setText('当前时间:' + time.toString("yyyy/MM/dd HH:mm:ss dddd"))  # 让标签显示当前时间

    
app = QApplication(sys.argv)  # 创建应用程序
ex = Example()  # 创建窗口对象
sys.exit(app.exec_())  # 设置关闭窗口后结束进程

拓展练习:尝试将setAlignment对齐参数改为Qt.AlignRight,让标签都右对齐。

小结 #

  • 学习了如何让标签文本水平居中显示。
  • 学习了如何使用伸缩量调节控件间距。
  • 习题 #

    1. 习题1:尝试自定义控件间的伸缩量大小。