一.簡介
PyQt5 是一個用於建立圖形使用者介面(GUI)應用程式的 Python 繫結,它基於 Qt 庫。PyQt5 提供了大量的元件(也稱為控制元件或部件),用於構建複雜的使用者介面。以下是一些常用的 PyQt5 元件
二.元件用法
1.數字元件(QLCDNumber)
class FileChooserApp(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): lcd = QLCDNumber() # 建立一個數字控制元件 sld = QSlider(Qt.Horizontal) # 建立一個進度條控制元件 vbox = QVBoxLayout() # 建立一個垂直佈局 vbox.addWidget(lcd) # vbox.addStretch(1) vbox.addWidget(sld) self.setLayout(vbox) # 新增到佈局器中 sld.valueChanged.connect(lcd.display) # 將數字和進度條聯動繫結在一起 self.setWindowTitle('檔案選擇器') self.setGeometry(300, 300, 500, 500)
上述中建立了一個數字元件和一個進度條元件,兩者繫結在一起,透過滑動進度條來改變數字。
2.快捷鍵(Key_Space)
def keyPressEvent(self, e): # 重寫keyPressEvent if e.key() == Qt.Key_Space: # 如果按下空格鍵退出程式,Qt.Key_Escape也可寫成具體的數字32 print("事件") self.close()
除了Qt.Key_Space外還有上千種快捷操作,可以在封裝好的Qt.py下檢視,這裡列舉幾個最常用的。
Qt.Key_Return 或 Qt.Key_Enter | 代表Enter鍵 |
Qt.Key_Space | 代表空格鍵 |
Qt.Key_A 到 Qt.Key_Z | 代表 A 到 Z 的字母鍵 |
Qt.Key_0 到 Qt.Key_9 | 代表 0 到 9 的數字鍵 |
Qt.Key_F1 到 Qt.Key_F12 | 代表功能鍵 F1 到 F12 |
Qt.Key_Tab | 代表 Tab 鍵 |
Qt.Key_Backspace | 代表退格鍵(Backspace) |
Qt.Key_Delete | 代表刪除鍵 |
Qt.Key_Home和 Qt.Key_End | 代表 Home 和 End 鍵 |
Qt.Key_Left, Qt.Key_Right, Qt.Key_Up, Qt.Key_Down | 代表方向鍵 |
Qt.Key_Plus 和 Qt.Key_Minus | 代表加號(+)和減號(-)鍵(注意,這些與數字鍵盤上的加減號不同) |
Qt.Key_PageUp 和 Qt.Key_PageDown | 代表翻頁鍵 |
3.滑鼠位置跟蹤
class FileChooserApp(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): x = 0 y = 0 text = "x: {0},y: {1}".format(x, y) # 設定預設值0,0 self.label = QLabel(text, self) # 座標新增到laber元件裡 self.label.resize(150, 20) # 設定元件長寬 self.setMouseTracking(True) # x,y顯示在laber元件裡 self.setGeometry(300, 300, 350, 200) self.setWindowTitle('滑鼠座標') # 滑鼠位置跟蹤 def mouseMoveEvent(self, e): # e表示當前滑鼠物件,x(),y()得到滑鼠x,y座標 x = e.x() y = e.y() text = "x: {0},y: {1}".format(x, y) self.label.setText(text) if __name__ == '__main__': app = QApplication(sys.argv) ex = FileChooserApp() ex.show() sys.exit(app.exec_())
註釋寫的很清楚了,這裡直接演示效果。滑鼠在介面內移動,座標實時顯示,
4.事件傳送,獲取觸發事件的資訊
class FileChooserApp(QMainWindow): def __init__(self): super().__init__() self.initUI() # 事件傳送,獲取某個事件行為 def initUI(self): btn1 = QPushButton("Button 1", self) btn1.move(30, 50) btn2 = QPushButton("Button 2", self) btn2.move(150, 50) btn1.clicked.connect(self.click) btn2.clicked.connect(self.click) self.statusBar() # 底部狀態列 self.setGeometry(500, 500, 290, 150) self.setWindowTitle('button') def click(self): sender = self.sender() # 用於接收訊號 self.statusBar().showMessage(sender.text()) # 狀態列設定點選按鈕的內容 if __name__ == '__main__': app = QApplication(sys.argv) ex = FileChooserApp() ex.show() sys.exit(app.exec_())
當我們點選兩個按鈕中任意一個時,sender()方法接收訊號的來源於,來判斷是點選哪個按鈕觸發的訊號。
5.可輸入內容彈框(QInputDialog)
class FileChooserApp(QMainWindow): def __init__(self): super().__init__() self.initUI() # 二級輸入彈框 def initUI(self): self.btn = QPushButton('Dialog', self) self.btn.move(20, 20) self.btn.clicked.connect(self.showDialog) self.le = QLineEdit(self) self.le.move(130, 22) self.setGeometry(500, 500, 290, 150) self.setWindowTitle('Input dialog') def showDialog(self): """ QInputDialog建立彈框,第一個參數列示彈框title,第二個參數列示輸入框說明 text為輸入後返回的內容 ok:bool型別,ok為true,false為cancel """ text, ok = QInputDialog.getText(self, 'Input Dialog', '輸入你的名字') if ok: self.le.setText(str(text)) if __name__ == '__main__': app = QApplication(sys.argv) ex = FileChooserApp() ex.show() sys.exit(app.exec_())
點選按鈕時觸發QInputDialog彈框,輸入內容點選ok時,將輸入的內容賦予QLineEdit中。
6.顏色元件(QColor)
class FileChooserApp(QMainWindow): def __init__(self): super().__init__() self.initUI() # 選擇顏色 def initUI(self): col = QColor(0, 0, 0) # 初始化QFrame顏色 self.btn = QPushButton('Dialog', self) self.btn.move(20, 20) self.btn.clicked.connect(self.showDialog) self.frm = QFrame(self) self.frm.setStyleSheet("QWidget { background-color: %s }" % col.name()) # 設定QFrame樣式,col.name() 返回的是一個有效的顏色值 self.frm.setGeometry(130, 22, 100, 100) self.setGeometry(300, 300, 250, 180) self.setWindowTitle('Color dialog') def showDialog(self): col = QColorDialog.getColor() # 彈出顏色選擇框 if col.isValid(): # true設定顏色,false返回 self.frm.setStyleSheet("QWidget { background-color: %s }" % col.name()) if __name__ == '__main__': app = QApplication(sys.argv) ex = FileChooserApp() ex.show() sys.exit(app.exec_())
點選按鈕時彈出顏色選擇框(QColorDialog.getColor()),選擇顏色後isValid()判斷是否已選擇,或者取消選擇。
7.文字字型型別元件
class FileChooserApp(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): btn = QPushButton('選擇字型', self) btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) btn.move(20, 20) btn.clicked.connect(self.showDialog) self.ql = QLineEdit(self) self.ql.move(150,20) self.setGeometry(500, 500, 250, 180) self.setWindowTitle('字型') def showDialog(self): font, ok = QFontDialog.getFont() # 開啟文字選擇框,font為返回的格式,ok為true if ok: self.ql.setFont(font) if __name__ == '__main__': app = QApplication(sys.argv) ex = FileChooserApp() ex.show() sys.exit(app.exec_())
點選按鈕時彈出字型型別選擇框(QFontDialog.getFont()),選擇字型後返回一個字型型別和一個bool值,判斷是否已選擇,或者取消選擇。
8.核取方塊(QCheckBox)
# 核取方塊 def initUI(self): self.laber = QLabel(self) self.laber.setText("初始值") self.laber.move(150, 20) cb = QCheckBox('核取方塊', self) # 建立一個核取方塊, cb.move(20, 20) cb.toggle() """ 切換核取方塊的選中狀態。如果核取方塊當前是未選中的,它將被選中;如果它是已選中的,它將被取消選中。 預設情況下,新建立的核取方塊是未選中的。因此,呼叫toggle()將使其變為選中狀態 """ cb.stateChanged.connect(self.changeTitle) # stateChanged選擇狀態傳送變化時 self.setGeometry(500, 500, 250, 150) self.setWindowTitle('QCheckBox') def changeTitle(self, state): if state == Qt.Checked: # 當選中時,重置文字 self.laber.setText("已選中") else: self.laber.setText("未選中") # 當未選中時,重置文字
效果如下
9.按鈕狀態切換
def initUI(self): self.col = QColor(0, 0, 0) # 初始值為黑色 redb = QPushButton('Red', self) redb.setCheckable(True) redb.move(10, 10) redb.clicked[bool].connect(self.setColor) # 返回bool型別 greenb = QPushButton('greenb', self) greenb.setCheckable(True) # 設定按鈕為可選擇按鈕 greenb.move(100, 10) greenb.clicked[bool].connect(self.setColor) # 返回bool型別 blueb = QPushButton('blueb', self) blueb.setCheckable(True) blueb.move(200, 10) blueb.clicked[bool].connect(self.setColor) # 返回bool型別 self.frame = QFrame(self) self.frame.move(100, 100) self.frame.setStyleSheet("QFrame { background-color: %s }" % self.col.name()) # 設定QFrame樣式,col.name() 返回的是一個有效的顏色值 def setColor(self, status): sender = self.sender() # 獲取訊號源 if status: val = 255 # 顏色深度 else: val = 0 # if sender.text() == "Red": self.col.setRed(val) # 設定color為紅色 elif sender.text() == "greenb": self.col.setGreen(val) # 設定顏色,數字表示顏色深度 elif sender.text() == "blueb": self.col.setBlue(val) self.frame.setStyleSheet("QWidget { background-color: %s }" % self.col.name()) # 設定QFrame樣式,col.name() 返回的是一個有效的顏色值
建立了三個按鈕,分別是紅,綠,藍,設定按鈕為可選擇按鈕。當點選按鈕時,傳送訊號給槽,返回一個bool值,setcolor接收這個bool值,判斷為true時,設定顏色深度,並透過sender()來獲取是哪個按鈕被點選了,從而設定QFrame的值。
上面例項中有個小缺陷,在選中一個按鈕是,應當判斷其它按鈕有沒有被選中,若選中需取消選擇,這樣不會出現顏色偏差。
10.滑塊元件
# 滑塊 def initUI(self): sld_h = QSlider(Qt.Horizontal, self) # 設定水平滑塊 sld_h.move(0,0) sld_v = QSlider(Qt.Vertical, self) # 設定垂直滑塊 sld_v.move(0,100) sld_h.setFocusPolicy(Qt.NoFocus) # 設定水平滑塊鍵盤不可滑動 # 設定滑塊的範圍 sld_h.setRange(0, 100) # 設定滑塊的初始值 sld_h.setValue(0) sld_h.setValue(50) sld_h.valueChanged[int].connect(self.slider) # 返回一個數字 self.label = QLabel(self) self.label.setText("初始值") # self.label.setPixmap(QPixmap('mute.png')) # 可將label控制元件新增圖片,可以製作音量調節 self.label.move(200,0) self.setGeometry(500,500,500,500) def slider(self, i): # 接收數字時判斷 if i == 0: self.label.setText("最小值") elif 0 < i < 50: self.label.setText("中間值") else: self.label.setText("最大值")
11.日誌
# 日曆 def initUI(self): cal = QCalendarWidget(self) # 建立一個日曆控制元件 cal.setGridVisible(False) # 設定控制元件網格是否可見,True可見 cal.clicked[QDate].connect(self.showDate) # 返回一個基於pyqt5的日期格式 self.lbl = QLabel(self) self.lbl.move(0, 350) date = cal.selectedDate() # 獲取當前時間 print(date) self.lbl.setText(date.toString()) # 設定預設展示當前時間 self.setGeometry(500, 500, 500, 500) def showDate(self, data): self.lbl.setText(data.toString())
12.下拉框
import sys from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QComboBox class Example(QWidget): def __init__(self): super().__init__() self.initUI() # 下拉框 def initUI(self): self.lbl = QLabel("Ubuntu", self) combo = QComboBox(self) # 建立一個下拉框控制元件 combo.addItem("紅") combo.addItem("黃") combo.addItem("綠") combo.addItem("青") combo.addItem("藍") combo.move(50, 50) self.lbl.move(50, 150) combo.activated[str].connect(self.onActivated) # 當下拉框索引傳送變化時,返回一個選擇值 self.setGeometry(300, 300, 300, 200) self.setWindowTitle('QComboBox') def onActivated(self, st): self.lbl.setText(st) self.lbl.adjustSize() # 自定義適配長度 if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() ex.show() sys.exit(app.exec_())