1. 程式人生 > >vnpy原始碼閱讀學習(2):學習PyQt5

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圖示

常見的元件

  1. QCheckBox
  2. QPushButton
  3. QSlider
  4. QProgressBar
  5. QCalendarWidget
  6. QPixmap
  7. QLineEdit
  8. QSplitter
  9. 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()

另外還有幾個問題需要進一步思考:

  1. 傳送如何寫在類中,比如自定義一個控制元件,然後這個類出發事件,可以給別的類呼叫例項化的物件的時候處理?
  2. 訊號槽如何傳送帶引數的訊息。

    對話方塊

  3. QInputDialog
  4. QColorDialog
  5. QFontDialog
  6. QFileDialog
  7. 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圖形介面編