PyQt5 GUI程式設計(元件使用)

余生没有余生發表於2024-05-18

一.簡介

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.滑鼠位置跟蹤

PyQt5 GUI程式設計(元件使用)
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_())
View Code

註釋寫的很清楚了,這裡直接演示效果。滑鼠在介面內移動,座標實時顯示,

4.事件傳送,獲取觸發事件的資訊

PyQt5 GUI程式設計(元件使用)
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_())
View Code

當我們點選兩個按鈕中任意一個時,sender()方法接收訊號的來源於,來判斷是點選哪個按鈕觸發的訊號。

5.可輸入內容彈框(QInputDialog)

PyQt5 GUI程式設計(元件使用)
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_())
View Code

點選按鈕時觸發QInputDialog彈框,輸入內容點選ok時,將輸入的內容賦予QLineEdit中。

6.顏色元件(QColor)

PyQt5 GUI程式設計(元件使用)
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_())
View Code

點選按鈕時彈出顏色選擇框(QColorDialog.getColor()),選擇顏色後isValid()判斷是否已選擇,或者取消選擇。

7.文字字型型別元件

PyQt5 GUI程式設計(元件使用)
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_())
View Code

點選按鈕時彈出字型型別選擇框(QFontDialog.getFont()),選擇字型後返回一個字型型別和一個bool值,判斷是否已選擇,或者取消選擇。

8.核取方塊(QCheckBox)

PyQt5 GUI程式設計(元件使用)
    # 核取方塊
    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("未選中")  # 當未選中時,重置文字
View Code

效果如下

9.按鈕狀態切換

PyQt5 GUI程式設計(元件使用)
    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() 返回的是一個有效的顏色值
View Code

建立了三個按鈕,分別是紅,綠,藍,設定按鈕為可選擇按鈕。當點選按鈕時,傳送訊號給槽,返回一個bool值,setcolor接收這個bool值,判斷為true時,設定顏色深度,並透過sender()來獲取是哪個按鈕被點選了,從而設定QFrame的值。

上面例項中有個小缺陷,在選中一個按鈕是,應當判斷其它按鈕有沒有被選中,若選中需取消選擇,這樣不會出現顏色偏差。

10.滑塊元件

PyQt5 GUI程式設計(元件使用)
 # 滑塊
    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("最大值")
View Code

11.日誌

PyQt5 GUI程式設計(元件使用)
    # 日曆
    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())
View Code

12.下拉框

PyQt5 GUI程式設計(元件使用)
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_())
View Code

相關文章