4.2.10日历:QCalendar
日历控件属于QCalendar类,它基于月份的视图,通过鼠标或键盘选择日期,默认选中的是今天的日期。QCalendar类中的常用方法如下:
setDateRange():设置日期范围供选择
setFirstDayOfWeek():重新设置星期的第一天,默认是星期日。
参数枚举: Qt.Monday:星期一
Qt.Tuesday:星期二
Qt.Wednesday:星期三
Qt.Thursday:星期四
Qt.Friday:星期五
Qt.Saturday:星期六
Qt.Sunday:星期日
setMinimumDate():设置最大日期
setMaximumDate():设置最小日期
setSelectedDate():设置一个QDate对象,作为日期控件所选定的日期
maximumDate:获取日历控件的最大日期
minimumDate:获取日历控件的最小日期
selectedDate():返回当前选定的日期
setGridvisible():设置日历控件是否显示网格
QCalendarWidget类提供了下列4个信号:
clicked:单击日期时发送该信号。
selectionChanged():日期改变时发送该信号。
activated():日历活化时发送该信号。
currentPageChanged():改变页时发送该信号。
【例4.13】QCalendar日历测试。 代码如下(calendar.py): 运行程序,显示如图。
import sys # 导入sys模块,用于处理Python解释器相关的操作,如命令行参数等。
from PyQt6 import QtCore # 从PyQt6库中导入QtCore模块,包含PyQt6的核心非GUI功能。
from PyQt6.QtWidgets import * # 从PyQt6库中导入QtWidgets模块,包含所有GUI组件。
from PyQt6.QtCore import QDate # 从PyQt6的QtCore模块中单独导入QDate类,用于处理日期。
class MyWidget(QWidget): # 定义一个名为MyWidget的类,继承自QWidget,作为主窗口。
def __init__(self): # 初始化方法,当创建MyWidget对象时自动调用。
super(MyWidget, self).__init__() # 调用父类QWidget的初始化方法。
self.setGeometry(100, 100, 300, 240) # 设置窗口的位置和大小,分别为x=100, y=100, 宽=300, 高=240。
self.setWindowTitle('Calendar测试') # 设置窗口的标题为“Calendar测试”。
self.initUI() # 调用自定义的initUI方法来初始化用户界面。
def initUI(self): # 初始化用户界面的方法。
self.cal = QCalendarWidget(self) # 创建一个日历控件,并设置其父窗口为当前MyWidget对象。
self.cal.setMinimumDate(QDate(2000, 1, 1)) # 设置日历控件可显示的最小日期为2000年1月1日。
self.cal.setMaximumDate(QDate(2100, 1, 1)) # 设置日历控件可显示的最大日期为2100年1月1日。
self.cal.setGridVisible(True) # 设置日历控件中的网格可见。
self.cal.move(10, 10) # 将日历控件移动到窗口的(10, 10)位置。
self.cal.clicked[QtCore.QDate].connect(self.labShow) # 当在日历控件中点击某个日期时,触发labShow方法。
date = self.cal.selectedDate() # 获取当前日历控件中选中的日期。
self.lb = QLabel(self) # 创建一个QLabel对象,用于显示日期,设置其父窗口为当前MyWidget对象。
self.lb.setText(date.toString("yyyy-MM-dd ddd")) # 设置QLabel的文本为选中的日期的格式化字符串。
self.lb.move(10, 210) # 将QLabel移动到窗口的(10, 210)位置。
def labShow(self, date): # 定义一个方法,用于显示用户点击的日期。
self.lb.setText(date.toString("yyyy-MM-dd ddd")) # 设置QLabel的文本为用户点击的日期的格式化字符串。
if __name__ == '__main__': # 检查当前脚本是否作为主程序运行。
app = QApplication(sys.argv) # 创建一个QApplication对象,这是PyQt6应用程序的入口点。
w = MyWidget() # 创建一个MyWidget对象。
w.show() # 显示MyWidget窗口。
sys.exit(app.exec()) # 进入Qt应用程序的主循环,等待用户交互。当应用程序结束时,通过sys.exit退出Python解释器。
这段代码主要实现了一个简单的PyQt6 GUI应用程序,该应用程序包含一个标签(QLabel)用于显示提示信息,一个数值选择框(QSpinBox)用于用户选择或输入数字,以及另一个标签用于显示用户选择的数字。
使用的布局和控件:
- 布局:
QHBoxLayout
:水平布局,用于将标签和数值选择框水平放置。QVBoxLayout
:垂直布局,用于组织整个窗口的部件,包括水平布局和第二个标签。
- 控件:
QWidget
:作为主窗口的基类。QLabel
:用于显示文本标签的控件。这里有两个标签,一个用于显示提示信息“选择或者输入数字:”,另一个用于显示用户输入的数值。QSpinBox
:一个数值选择框控件,允许用户通过点击箭头或使用键盘来选择或输入一个整数。
说明:
1.在窗口上创建日历控件对象,设置日历日期显示范围,显示网格,移动到窗口指定位置,关联单机日历操作的槽函数。
2.在窗口上创建标签控件对象,移到日历控件下面合适位置,调用selectedDate方法检索日历默认日期(当前日期),将日期对象转换为指定格式字符串在标签控件上显示。
关键语句:
-
self.setWindowTitle("SpinBox测试")
:设置窗口的标题为“SpinBox测试”。 -
self.resize(300, 100)
:设置窗口的大小为300x100像素。 -
self.sb = QSpinBox()
:创建一个QSpinBox实例,用于用户选择或输入数值。 -
self.sb.valueChanged.connect(self.valueFunc)
:连接QSpinBox的valueChanged
信号到valueFunc
槽函数。当用户在QSpinBox中选择或输入新的数值时,这个信号会被触发,调用valueFunc
函数。 -
self.lb2.setAlignment(Qt.AlignmentFlag.AlignCenter)
:设置第二个标签(用于显示数值的)的文本对齐方式为居中。 -
hLayout.addWidget(self.lb1)
和hLayout.addWidget(self.sb)
:将提示标签和数值选择框添加到水平布局中。 -
vLayout_ww.addLayout(hLayout)
和vLayout_ww.addWidget(self.lb2)
:将水平布局和第二个标签添加到垂直布局中。 -
def valueFunc(self)
:定义了一个槽函数,当QSpinBox的值改变时会被调用。 -
self.lb2.setText("输入值: "+str(self.sb.value()))
:在valueFunc
函数中,获取QSpinBox的当前值,将其转换为字符串,并设置到第二个标签的文本中,以显示用户选择的数值。