总体介绍

QCalendarWidget类提供了一个基日历小部件,允许用户选择一个日期。

【PyQt5-Qt Designer】日历(QCalendarWidget)

该小部件使用当前的月份和年份进行初始化,但是QCalendarWidget提供了几个公共槽函数来更改显示的年份和月份。

 

默认情况下,选择今天的日期,用户可以使用鼠标和键盘选择日期。当前选择的日期可以使用selectedDate()函数进行检索。

通过设置minimumDate和maximumDate属性,可以将用户选择约束到给定的日期范围。或者,可以使用setDateRange()函数一次性设置这两个属性。

将selectionMode属性设置为NoSelection以禁止用户选择。请注意,还可以使用setSelectedDate()可以让程序选择日期。

 

当前显示的月份和年份可分别使用monthShown()和yearShown()函数进行检索。

 

新创建的日历小部件使用缩短的日期名称,星期六和星期日都标记为红色。日历网格不可见。显示星期编号,第一个列。日是日历区域设置的第一天。

 

通过将horizontalHeaderFormat属性设置为QCalendarWidget.SingleLetterDayNames,可以将日期的符号更改为单个字母缩写(“M”代表“Monday”)。将相同的属性设置为QCalendarWidget.LongDayNames将使标题显示完整的日期名称。可以通过将verticalHeaderFormat属性设置为QCalendarWidget. NoVerticalHeader来删除周数。日历网格可以通过使用setGridVisible()函数将gridVisible属性设置为True来开启。

【PyQt5-Qt Designer】日历(QCalendarWidget)

calendar = QCalendarWidget(self)
calendar.setGridVisible(True)

最后,可以使用setFirstDayOfWeek()函数更改第一列中的日期。

 

QCalendarWidget类还提供了三个信号,selectionChanged(),activated()和currentPageChanged(),可以响应用户交互。

 

通过设置QTextCharFormat的一些特殊的工作日,特殊的日期或头文件的渲染,可以在很大程度上定制标题,工作日或单日的渲染。

 

日历小部件只使用QTextCharFormat中的一部分属性。目前,使用前景,背景和字体属性来确定窗口小部件中单个单元格的渲染。

 

一些QCalendarWidget设置的介绍

QCalendarWidget.HorizontalHeaderFormat

定义了水平头可以显示的各种格式。

【PyQt5-Qt Designer】日历(QCalendarWidget)

QCalendarWidget.SelectionMode

描述了提供给用户在日历中选择日期的选择类型

【PyQt5-Qt Designer】日历(QCalendarWidget)

QCalendarWidget.VerticalHeaderFormat

定义了垂直标题可以显示的各种格式。

【PyQt5-Qt Designer】日历(QCalendarWidget)

更多详细的介绍,请见官方文档:QCalendarWidget Class

类的归属

PyQt5->QtWidgets->QCalendarWidget

继承:QWidget

小例子

我们先通过一个小动画来看一下今天的完成效果:

【PyQt5-Qt Designer】日历(QCalendarWidget)

核心代码

程序的界面是由Qt设计师完成的,具体的设计大家可以自行去看源码就知道了,这里主要把功能介绍一下。 

class Dialog_selected(QDialog, Ui_Dialog):
    """
    Class documentation goes here.
    """
    def __init__(self, parent=None):
        """
        Constructor

        @param parent reference to the parent widget
        @type QWidget
        """
        super(Dialog_selected, self).__init__(parent)
        self.setupUi(self)
        self. appkey = "你的appkey"

    @pyqtSlot(QDate)
    def on_calendarWidget_clicked(self, date):
        """
        Slot documentation goes here.

        @param date DESCRIPTION
        @type QDate
        """
        date = self.calendarWidget.selectedDate().toString("yyyy-MM-dd dddd")
        self.request1(self.appkey, date)

    def request1(self, appkey, date):
        url = "http://v.juhe.cn/laohuangli/d"
        params = {
            "key" : appkey, #应用APPKEY(应用详细页查询)
            "date" : date #日期,格式2014-09-09
        }
        f = requests.get(url, params=params)

        content = f.text
        res = json.loads(content)
        if res:
            error_code = res["error_code"]
            data = res["result"]
            if error_code == 0:                #成功请求
                self.label.setText("阳历:" + date)
                self.label_2.setText("阴历:" + data["yinli"])
                self.label_3.setText("忌:" + data["ji"])
                self.label_4.setText("宜:" + data["yi"])
            else:
                QMessageBox.Warning(self, "警告", "错误代码:" + res["error_code"] + "错误原因:" + res["reason"])
        else:
            QMessageBox.Warning(self,"警告","API请求失败")

这段代码有一半是有eric6自动生成的。on_calendarWidget_clicked(self, date)的部分和request1(self, appkey, date)是我自己改写的。

主要功能就是我们单击日历上的日期然后会出现对应的阳历、阴历、忌、宜等黄历信息。这只是一个示例程序,实现上也比较简单。

这里我不用eric6又重新完全用代码写了一遍,

效果如下:

【PyQt5-Qt Designer】日历(QCalendarWidget)

完整代码如下:

  1 from PyQt5.QtWidgets import (QApplication,QWidget,QCalendarWidget,QLabel,QSlider,QGridLayout)
  2 from PyQt5.QtCore import Qt,pyqtSignal
  3 import sys,requests,json
  4 
  5 class Example(QWidget):
  6     _signal = pyqtSignal(str,str)
  7     def __init__(self):
  8         super(Example, self).__init__()
  9         self.initUI()
 10 
 11     def initUI(self):
 12         self.setGeometry(300,300,450,380)
 13         self.setWindowTitle("QCalendarWidget日历+爬虫")
 14         gridLayout = QGridLayout()
 15         self.calendar = QCalendarWidget()
 16         self.calendar.setGridVisible(True)
 17         self.lb11 = QLabel("阳历:")
 18         self.lb12 = QLabel("")
 19         self.lb21 = QLabel("阴历:")
 20         self.lb22 = QLabel("")
 21         self.lb31 = QLabel("五行:")
 22         self.lb32 = QLabel("")
 23         self.lb41 = QLabel("冲煞:")
 24         self.lb42 = QLabel("")
 25         self.lb51 = QLabel("彭祖百忌:")
 26         self.lb52 = QLabel("")
 27         self.lb61 = QLabel("吉神:")
 28         self.lb62 = QLabel("")
 29         self.lb71 = QLabel("宜:")
 30         self.lb72 = QLabel("")
 31         self.lb81 = QLabel("凶神:")
 32         self.lb82 = QLabel("")
 33         self.lb91 = QLabel("忌:")
 34         self.lb92 = QLabel("")
 35         gridLayout.addWidget(self.calendar,0,0,1,3)
 36         gridLayout.addWidget(self.lb11,1,0,1,1)
 37         gridLayout.addWidget(self.lb12,1,1,1,2)
 38         gridLayout.addWidget(self.lb21,2,0,1,1)
 39         gridLayout.addWidget(self.lb22,2,1,1,2)
 40         gridLayout.addWidget(self.lb31,3,0,1,1)
 41         gridLayout.addWidget(self.lb32,3,1,1,2)
 42         gridLayout.addWidget(self.lb41, 4, 0, 1, 1)
 43         gridLayout.addWidget(self.lb42, 4, 1, 1, 2)
 44         gridLayout.addWidget(self.lb51, 5, 0, 1, 1)
 45         gridLayout.addWidget(self.lb52, 5, 1, 1, 2)
 46         gridLayout.addWidget(self.lb61, 6, 0, 1, 1)
 47         gridLayout.addWidget(self.lb62, 6, 1, 1, 2)
 48         gridLayout.addWidget(self.lb71, 7, 0, 1, 1)
 49         gridLayout.addWidget(self.lb72, 7, 1, 1, 2)
 50         gridLayout.addWidget(self.lb81, 8, 0, 1, 1)
 51         gridLayout.addWidget(self.lb82, 8, 1, 1, 2)
 52         gridLayout.addWidget(self.lb91, 9, 0, 1, 1)
 53         gridLayout.addWidget(self.lb92, 9, 1, 1, 2)
 54         self.setLayout(gridLayout)
 55 
 56         self.calendar.selectionChanged.connect(self.mySignal)
 57         self._signal.connect(self.request1)
 58 
 59     def mySignal(self):
 60         # print(self.calendar.selectedDate())
 61         self.date = self.calendar.selectedDate().toString("yyyy-MM-dd")
 62         self.appkey = "3f669268cbe38f049f9f20877c127bcf"
 63         self._signal.emit(self.appkey,self.date)
 64 
 65     # 日历
 66     def request1(self,appkey,date):
 67         try:
 68             url = "http://v.juhe.cn/laohuangli/d"
 69             params = {
 70                 "key": appkey,  # 应用APPKEY(应用详细页查询)
 71                 "date": date,  # 日期,格式2014-09-09
 72             }
 73             req = requests.get(url, params=params)
 74             req.encoding = 'utf8'
 75             content = req.text  # 得到的content是str格式,使用json.loads() 将其转为dict字典格式
 76             # print(content)
 77             res = json.loads(content)
 78             if res:
 79                 error_code = res["error_code"]
 80                 if error_code == 0:
 81                     # 成功请求
 82                     self.lb12.setText(res["result"]["yangli"])
 83                     self.lb22.setText(res["result"]["yinli"])
 84                     self.lb32.setText(res["result"]["wuxing"])
 85                     self.lb42.setText(res["result"]["chongsha"])
 86                     self.lb52.setText(res["result"]["baiji"])
 87                     self.lb62.setText(res["result"]["jishen"])
 88                     self.lb72.setText(res["result"]["yi"])
 89                     self.lb82.setText(res["result"]["xiongshen"])
 90                     self.lb92.setText(res["result"]["ji"])
 91                 else:
 92                     print("%s:%s" % (res["error_code"], res["reason"]))
 93             else:
 94                 print("request api error")
 95         except:
 96             pass
 97 
 98 
 99 if __name__ == '__main__':
100     app = QApplication(sys.argv)
101     ex = Example()
102     ex.show()
103     sys.exit(app.exec_())
日历+爬虫+自定义pyqtSignal(str,str)

相关文章:

  • 2022-12-23
  • 2021-12-08
  • 2021-08-05
  • 2021-06-04
  • 2021-07-08
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-06-20
  • 2021-06-30
  • 2022-12-23
  • 2021-08-30
  • 2022-12-23
  • 2021-09-16
  • 2022-12-23
相关资源
相似解决方案