get paid

Get paid for the tasks you do online

2019年1月30日 星期三

PyQT5 教學 --- QCalendar 使用 Class

上一篇有介紹到 Qcalendar, 但並沒有使用 Class 來定義主視窗 ,
這篇就來介紹如何使用 Class 定義主視窗, 其實 code 跟function 差不多

基本概念很間單, 我們先定義一個主視窗的 class .  這個class 繼承QWidget, 或 Qmessage class
之後我們再將視窗內會用到的元件如 button , label 加入到 class 內

程式解說如下

# import necessary package

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QCalendarWidget
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtCore import Qt

#定義主視窗 叫 windows 的 class, 這個class 繼承QWidget
#這個跟 上一篇 的 win = QWidget()  意思差不多

class windows(QWidget):

    def __init__(self):  #用來初始化這個類別會用到的變數

        super().__init__()  # 這個 class 可以使用父類別的function

        self.calendar = QCalendarWidget(self) # 將 QcalendarWidget 加入此視窗
     
這個部分跟 function 很像 只是前面變數, 我們要加 self. 讓這變數可以在這 class 內使用
使用function 時 後面我們帶入要加入的視窗物件, 但我們已經在此物件內了, 所以直接使 用self 來代表此物件

        self.calendar.setGeometry(50,50,300,300) #設定位置
        self.calendar.selectionChanged.connect(self.showdate) #產生日曆選擇改變的signal.
     
 之前使用 function 時, 我們必須要把 calendar 這個物件一並傳入, 但使用class 時只要function 是在同一個 class 中就可以不用


        self.setWindowTitle("PyQt Calendar Example")
        self.setGeometry(50,50,400,400)
     
        self.show() #顯示此 windows

    def showdate(self): # 記得要加 self
        selectDay = self.calendar.selectedDate() #確認被選的日期,  記得要加 self

selectDay 是 PyQT 日期格式, 但如果我們是要用這日期給 SQL 處理時須轉換

        print("pyQT day",selectDay)
加入toString(Qt.ISODate) 就會變成string格式, 之後可以給 datetime package 處理
        print("normal day", selectDay.toString(Qt.ISODate))

selectDay 只會在 def showdate 這個function 內使用, 所以可以不用加self.  但如果此class 內其他地方會用到, 要在 init 內定義, 並且變數前面要加 self



if __name__ == '__main__':
    app = QApplication(sys.argv) #改寫在外面
    win=windows()
    sys.exit(app.exec_()) #改寫在外面

QApplication 如果寫在class 裡面會出錯, 因為要先有QApplication 才成有 Qwidget, 我們的windows class 是承接 Qwidget 的所以當然放在外面, 所以 sys.exit 也一並放在外面

執行結果



使用class 事不是相對於 function 更容易讓別人瞭解

我想很多人會對 class 很害怕是因為他們覺得很 繼承等很複雜很可怕
但其實經過講解其實不難, 直接寫成 code 就會發現 class 很好用

當然 上面的應用只用到 class 部分的好處, 這些好處當視窗變多後就變很重要
之後我會慢慢提到

我之所以會寫這Blog 主要是想一步一步介紹




沒有留言:

張貼留言

ChartGPT 學 python 很強喔

 ChartGPT 最近很紅 ,  前一陣子有一些小 module  本來想 google  一下 語法 但發現用 chartGPT 直接請他給 sample code 反而較快 所以只要你有基本 知識 ChartGPT 可以加速你的開發 好用喔