vnpy原始碼閱讀學習(2):學習PyQt5
PyQt5的學習
花費了一個下午把PyQt5大概的學習了下。找了一個教程 PyQt5教程 跟著挨著把上面的案例做了一遍,大概知道PyQt5是如何生成窗體,以及控制元件的。基本上做到如果有需求要實現,查查手冊,搜搜百度能實現的水平。
另外強烈推薦:PyQt5圖形介面程式設計
PyQt5就是python的GUI庫,用它來做一些桌面軟體,是QT的python版本。具體的簡介就不贅述了。記錄點自己學習的乾貨。
使用大概流程
首先當然是安裝PyQt5的類庫
pip3 install PyQt5
PyQt5的使用
import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QIcon class Example(QWidget): def __init__(self): super().__init__() self.initUI() #介面繪製交給InitUi方法 def initUI(self): #設定視窗的位置和大小 self.setGeometry(300, 300, 300, 220) #設定視窗的標題 self.setWindowTitle('Icon') #設定視窗的圖示,引用當前目錄下的web.png圖片 self.setWindowIcon(QIcon('web.png')) #顯示視窗 self.show() if __name__ == '__main__': #建立應用程式和物件 app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
然後幾乎就可以跑出來一個窗體了。至於窗體上的設定,幾乎看著英語就能知道如何寫。比如
self.setWindowTitle('設定標題')
self.setWindowIcon(QIcon('web.png')) #設定icon圖示
常見的元件
- QCheckBox
- QPushButton
- QSlider
- QProgressBar
- QCalendarWidget
- QPixmap
- QLineEdit
- QSplitter
- QComboBox
以上是這個教程上講到的控制元件。控制元件部分個人認為不需要花費時間去研究,如果用到了查查,經常用到了,自然能記得住。沒必要深入研究。
要使用一個元件,直接例項化,然後parent指定為當前的物件。就會出現在當前物件上
button = QButton('按鈕名稱',self)
#然後設定一些元件的特性並且把元件觸發的時間插入插槽就可以了,插槽接下來講解
button.move(200,100)
button.clicked.connect(self.button_click)
訊號和插槽 Signal&slot
這個應該算是重點了,因為UI最後還是要接受使用者的點選、輸入,要有事件產生並且能有處理事件的函式和方法。類似C#中的事件委託一樣。
插槽
要處理一個事件,比如一個按鈕的事件我們用插槽接受事件訊號。如下虛擬碼
button.clicked.connect(self.button_click) #插槽 def button_click(self): #被點選執行的程式碼 #訊號的傳送者 sender = self.sender()
訊號與發出訊號
#我們需要定義一個傳送訊號的物件
class Communicate(QObject):
closeApp = pyqtSignal()
#在傳送訊號的窗體類程式碼
class Example(QMainWindow):
def __init__(self):
self.c = Communicate()
def mousePressEvent(self, event):
#出發訊號的傳送
self.c.closeApp.emit()
另外還有幾個問題需要進一步思考:
- 傳送如何寫在類中,比如自定義一個控制元件,然後這個類出發事件,可以給別的類呼叫例項化的物件的時候處理?
訊號槽如何傳送帶引數的訊息。
對話方塊
- QInputDialog
- QColorDialog
- QFontDialog
- QFileDialog
QMessageBox
個人認為對話方塊沒有太多需要講解的。用到了查查,知道如何彈出,如何獲得彈出後操作的結果就可以了。
關於窗體如何彈出。每一個集成了QWidget的窗體,都會有一個show方法,在需要彈出的地方呼叫他們就可以彈出了。
模態窗體
方法 | 說明 |
---|---|
setWindowModality() | Qt.NonModal:非模態,可以和程式的其他視窗進行互動 |
Qt.WindowModal:視窗模態,程式在未處理玩當前對話方塊時,將阻止和對話方塊的父視窗進行互動 | |
Qt.ApplicationModal:應用程式模態,阻止和任何其他視窗進行互動 |
繪圖
如果要自定義控制元件,少不了需要做繪圖。
python的控制元件會自動呼叫paintEvent事件。所以只需要呼叫paitEvent事件,就可以做到繪圖。
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
self.drawText(event, qp)
qp.end()
而paintEvent會在需要控制元件重繪的時候,進行呼叫,如果要強制重匯。需要在這個方法中呼叫:
.update()
自定義控制元件
通過視覺化的方法設計GUI
參考
PyQt5-簡明中文教程
Qt5文件
PyQt5圖形介面編