在這里,我將根據自己的學習歷程從初級到高級介紹pyqt5。因為是學到哪里就寫道哪里,所以內容排版比較隨意。有兩點問題需要先說明:
1.雖然界面的設計可以借助qt designer進行拖拽創建,並且可以大大簡化操作,提高效率。但個人感覺對於初學者來說,先理解pyqt5的各函數和方法,對加深理解大有幫助。
2.pyqt5的使用應該堅持界面於邏輯分離的原則。本節因為是基礎介紹,暫未將界面於邏輯分離,后續內容會涉及。
一、基本窗口
在這里,我們先通過一個小例子對pyqt5有意個初步的認知。

import sys,time from PyQt5.QtWidgets import QApplication,QWidget #這里導入了PyQt5.QtWidgets模塊,里面包含了基本的組件 if __name__=="__main__": app = QApplication(sys.argv) win = QWidget() win.resize(500,400) #窗口寬500px,高400px #win.show() #time.sleep(3) win.move(500,500) #將窗口移動到屏幕上(500,500)處 win.setWindowTitle("hello world") win.show()
注:
- 退出時app.exec_() 之所以在exec后加了一個下划線,是因為exec時pyth的關鍵字。
- 這個例子中引入了time模塊是為了體現出窗口位置的變化過程(已注釋掉)。
通過上面這個小例子,我們已經了解了pyqt5的基本功能,了解設置窗口大小,位置以及標題和窗口顯示的基本操作。
顯示效果如下
二、添加小控件
上一節的內容只是單個基礎窗口的顯示,我們還可以為窗口設置一些具有特殊功能的按鍵(pushbutton),並設置提示信息,提高操作友好度。下面是第二個小例子。

1 import sys 2 from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QToolTip 3 from PyQt5.QtGui import QIcon,QFont 4 from PyQt5.QtCore import QCoreApplication 5 6 7 class Win_Example(QWidget): 8 9 def __init__(self): 10 super().__init__() 11 self.initUI() 12 13 def initUI(self): 14 self.setGeometry(300,300,300,300) 15 self.setWindowTitle('第二個小例子') 16 self.setWindowIcon(QIcon('chuan.ico')) #設置窗口圖標,即窗體左上角的圖標,注意路徑問題 17 18 pushbtn =QPushButton('退出',self) 19 pushbtn.resize(pushbtn.sizeHint()) #resize是設置按鈕的大小,sizehint為默認大小 20 pushbtn.move(80,80) #設置按鈕的坐標為(80,80) 21 pushbtn.clicked.connect(QCoreApplication.instance().quit) #連接事件和信號 22 23 '''設置提示信息的格式,內容''' 24 QToolTip.setFont(QFont('楷體', 15)) 25 # self.setToolTip('這是提示信息') 26 self.setToolTip('這是<b>加粗的提示信息<b>') #兩個<b>之間的文字會加粗顯示 27 pushbtn.setToolTip('這是個按鈕') 28 29 30 if __name__ == "__main__": 31 app = QApplication(sys.argv) 32 win = Win_Example() 33 win.show() 34 sys.exit(app.exec_())
在上面的小例子中,我們加入了更多的命令,並采用了面向對象的方法來編程。
import sys from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QToolTip from PyQt5.QtGui import QIcon,QFont from PyQt5.QtCore import QCoreApplication
- QPushButton是一個按鍵類,可以為窗口添加按鍵;
- QToolTip是提示類,可以設置提示信息;
- QIcon和QFont是用來設置圖標和字體樣式;
self.setWindowIcon(QIcon('chuan.ico'))
這里為窗口設置了圖標,需要注意圖標的路徑問題。本例中,圖標就在當前目錄下。另外,圖標圖片為ico格式,最好選用32*32大小。當然,如果選擇更大的圖片,實際顯示時會自動壓縮。
pushbtn =QPushButton('退出',self) pushbtn.resize(pushbtn.sizeHint()) pushbtn.move(80,80) pushbtn.clicked.connect(QCoreApplication.instance().quit)
這里設置了按鈕,並將pushbutton的單擊事件與quit函數連接。這里涉及了信號和槽的概念,后續會專門學習,這里不做深入討論。
resize()可以自定義窗口的大小。sizehint()窗體默認大小
QToolTip.setFont(QFont('楷體', 15)) self.setToolTip('這是<b>加粗的提示信息<b>') pushbtn.setToolTip('這是個按鈕')
這里為窗體和按鍵都設置了提示信息,請注意:<b>...<b> <i>...<i> <u>...<u>分別可以設置提示信息加粗、斜體、下划線。這三中顯示方法可以單獨使用,也可以組合使用。另外,尖括號中的b、i、u大小寫均可。
顯示效果如下:(因為qq截圖的原因,圖片上的鼠標箭頭未能正確顯示)
三、設置中心顯示和對話框
我們平時在操作軟件時,有時候為了防止錯誤操作,會增加一個交互界面確認操作,通識為了美觀,通常希望窗口在屏幕中心顯示。現在,我們就來學習這兩個方法。在第二節的基礎上,我們更新代碼如下:

import sys from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QToolTip,QMessageBox,QDesktopWidget from PyQt5.QtGui import QIcon,QFont from PyQt5.QtCore import QCoreApplication class Win_Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300,300,300,300) self.setWindowTitle('第二個小例子') self.setWindowIcon(QIcon('chuan.ico')) #設置窗口圖標,即窗體左上角的圖標,注意路徑問題 self.center_show() pushbtn =QPushButton('退出',self) pushbtn.resize(pushbtn.sizeHint()) #resize是設置按鈕的大小,sizehint為默認大小 pushbtn.move(80,80) #設置按鈕的坐標為(80,80) pushbtn.clicked.connect(QCoreApplication.instance().quit) #連接事件和信號 '''設置提示信息的格式,內容''' QToolTip.setFont(QFont('楷體', 15)) # self.setToolTip('這是提示信息') self.setToolTip('這是<b>加粗的提示信息<b>') #兩個<b>之間的文字會加粗顯示 pushbtn.setToolTip('<u>這是個按鈕<u>') def closeEvent(self, QCloseEvent): res = QMessageBox.question(self,'對話框','是否確認退出',QMessageBox.Yes|QMessageBox.No,QMessageBox.No) if res == QMessageBox.Yes: QCloseEvent.accept() else: QCloseEvent.ignore() def center_show(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) if __name__ == "__main__": app = QApplication(sys.argv) win = Win_Example() win.show() sys.exit(app.exec_())
可以看到,首先我們有新引入了兩個類QmessageBox和QDesktopWidget。前者關於提示信息的對話框,后者可以提供屏幕的有關信息。
顯示效果如下:
下面,我們來分析代碼
def closeEvent(self, QCloseEvent): res = QMessageBox.question(self,'對話框','是否確認退出',QMessageBox.Yes|QMessageBox.No,QMessageBox.No) if res == QMessageBox.Yes: QCloseEvent.accept() else: QCloseEvent.ignore()
這個函數功能是用戶在點擊右上角按鍵退出時,彈出消息框確認是否真的要退出。有幾個知識點需要說明下:
3.1 QMessageBox消息框的幾種類型
- QMessageBox.information 信息框
- QMessageBox.question 問答框
- QMessageBox.warning 警告
- QMessageBox.ctitical危險
- QMessageBox.about 關於
可根據事件的嚴重級別選擇合適的消息框,這一點類似logger。
3.2 注意QMessageBox.question()的格式
QMessageBox.question(self,'對話框','是否確認退出',QMessageBox.Yes|QMessageBox.No,QMessageBox.No)意義是:消息框標題為“對話框“,消息框內容為“是否確認退出”,按鍵1為yes,按鍵2為no,默認按鍵為no。注意按鍵1和按鍵2中間一“|”分隔。
def center_show(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft())
設置窗口劇中的方法為通過self.frameGeometry()獲得主窗口大小並傳給對象qr,接着QDesktopWidget().availableGeometry().center()獲取顯示器分辨率並找到中心點位置,qr.moveCenter(cp)將主窗口中心移動到屏幕中心,self.move(qr.topLeft())窗口的左上角的坐標設置為qr的矩形左上角的坐標,這樣就把窗口居中了。
當然,這不是唯一的方法,還可以采用如下方法:
def center(self): screen = QDesktopWidget().screenGeometry() #用來計算顯示屏幕大小,QDsktopWidget是描述顯示屏幕的類 size = self.geometry() #獲取窗口大小 self.move((screen.width() - size.width()) / 2,(screen.height() - size.height()) / 2)
以上兩種方法都可以。