1. 程式人生 > 其它 >PyQt5-為元件的內建訊號編寫槽函式

PyQt5-為元件的內建訊號編寫槽函式

為元件的內建訊號編寫槽函式

圖是這樣

我們把確定按鈕綁定了accept()函式,把退出按鈕綁定了close()函式。接下來,我們來看一下清空按鈕。

清空:

首先在__init__()裡將其繫結一個函式

self.__ui.pushButton.clicked.connect(self.clear_text)

其次在myDialog類中編寫clear_text()函式

def clear_text(self):
    self.__ui.plainTextEdit.clear()

這樣清空按鈕的功能就實現了。

# # 與UI窗體類對應的業務邏輯類
import sys
from PyQt5.QtWidgets import QDialog, QApplication
from PyQt5.QtGui import QPalette
from PyQt5.QtCore import Qt, pyqtSlot
from Dialog import Ui_Dialog


class QmyDialog(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)  # 呼叫父類建構函式,建立QWidget窗體
        self.ui = Ui_Dialog()  # 建立UI物件
        self.ui.setupUi(self)  # 構造UI

        # ///////////// 自行新增的部分 /////////////

        """
        這部分如果是按照槽函式命名規則命名的,可以註釋掉,如果是自己命名的,那麼需要加上。
        命名規則:on_<object name>_<signal name>(<signal parameters>)
        如清空按鈕就是:on_btnClear_clicked
        """
        # ==================================================================
        # # 新增下劃線
        # self.ui.chkBoxUnder.clicked.connect(self.on_chkBoxUnder_clicked)
        #
        # # 修改編輯框中字型為斜體
        # self.ui.chkBoxItalic.clicked.connect(self.on_chkBoxItalic_clicked)
        #
        # # # 修改編輯框中字型為斜體
        # # self.ui.chkBoxItalic.toggled.connect(self.on_chkBoxItalic_toggled)
        #
        # # 新增加粗效果
        # self.ui.chkBoxBold.toggled.connect(self.on_chkBoxBold_toggled)
        #
        # # 新增clear效果
        # self.ui.btnClear.clicked.connect(self.on_btnClear_clicked)
        # ==================================================================

        # 設定顏色關聯函式
        self.ui.radioBlack.clicked.connect(self.do_setTextColor)
        self.ui.radioRed.clicked.connect(self.do_setTextColor)
        self.ui.radioBlue.clicked.connect(self.do_setTextColor)

    # #//////////////////自定義槽函式////////////////////

    # 設定文字顏色
    def do_setTextColor(self):
        plet = self.ui.plainTextEdit.palette()   # 獲取palette
        if(self.ui.radioBlack.isChecked()):
            plet.setColor(QPalette.Text, Qt.black)
        elif(self.ui.radioRed.isChecked()):
            plet.setColor(QPalette.Text, Qt.red)
        elif(self.ui.radioBlue.isChecked()):
            plet.setColor(QPalette.Text, Qt.blue)
        self.ui.plainTextEdit.setPalette(plet)

    # 將編輯框裡面的文字新增下劃線
    def on_chkBoxUnder_clicked(self):
        checked = self.ui.chkBoxUnder.isChecked()  # 讀取勾選狀態
        font = self.ui.plainTextEdit.font()
        font.setUnderline(checked)
        self.ui.plainTextEdit.setFont(font)

    # @pyqtSlot(bool)
    # # 將編輯框裡面的文字變為斜體
    # def on_chkBoxItalic_clicked(self, checked):
    #     # checked = self.ui.chkBoxItalic.isChecked()
    #     font = self.ui.plainTextEdit.font()
    #     font.setItalic(checked)
    #     self.ui.plainTextEdit.setFont(font)

    # 將編輯框裡面的文字變為斜體
    def on_chkBoxItalic_clicked(self):
        checked = self.ui.chkBoxItalic.isChecked()
        font = self.ui.plainTextEdit.font()
        font.setItalic(checked)
        self.ui.plainTextEdit.setFont(font)

    # # 將編輯框裡面的文字變為斜體
    # def on_chkBoxItalic_toggled(self, checked):
    #     # checked = self.ui.chkBoxItalic.isChecked()
    #     font = self.ui.plainTextEdit.font()
    #     font.setItalic(checked)
    #     self.ui.plainTextEdit.setFont(font)

    # 將編輯框裡面的內容加粗
    def on_chkBoxBold_toggled(self, checked):
        font = self.ui.plainTextEdit.font()
        font.setBold(checked)  # 引數checked表示勾選狀態
        self.ui.plainTextEdit.setFont(font)

    # 清除編輯框裡面的內容函式
    def on_btnClear_clicked(self):
        self.ui.plainTextEdit.clear()


if __name__ == "__main__":
    app = QApplication(sys.argv)  # 建立app,用QApplication類
    form = QmyDialog()
    form.show()
    sys.exit(app.exec_())

注意,程式碼中關於斜體部分,舉了3種方式,都可以實現其效果,其中有一種是@pyqtSlot(bool),這是overload型訊號

overload型訊號的處理,在QCheckBox類元件中,有兩個名稱為clicked的訊號,一個是不帶引數的clicked()訊號,使用這個訊號生成槽函式是可以自動關聯的;另一個是帶引數的clicked(bool)訊號,它將複選框的當前勾選狀態作為引數傳遞給槽函式。這種名稱相同但引數個數或型別不同的訊號就是overload型訊號。connectSlotsByName()函式進行訊號與槽函式的關聯時會使用一個預設的訊號,對QCheckBox來說,預設使用的是不帶引數的clicked()訊號,而如果定義on_chkBoxItalic_clicked(self,checked)是需要傳遞進來一個引數的,那麼如果想要使用這個槽函式,就需要使用@pyqtSlot修飾符,用這個修飾符將函式的引數型別宣告清楚。,這樣,connectSlotsByName()函式就會自動使用clicked(bool)訊號與這個槽函式關聯,執行就沒問題。