搜尋此網誌

2017年1月7日 星期六

PyQt5 教學 Part 3: 信號觸發

接著會介紹怎麼讓一個按鈕可以作動
首先我們先去教學文件裡面,尋找按鈕可以使用的Signal(信號)
QPushButton的文件
我們可以根據以下的文字發現總共有9個 signals 可以使用

Additional Inherited Members

4 signals inherited from QAbstractButton
3 signals inherited from QWidget
2 signals inherited from QObject

而其中點擊相關的信號都在 QAbstractButton




信號(signal)是Qt裡觸發其他功能的方式,在Qt的物件裡面還會有信號槽(slot),
在Qt的世界裡,物件與物件的資訊傳遞都是依靠發送訊號以及訊號的接受,
物件不管訊號發送了之後會發生什麼事情,接收的物件也不管訊號的來源。

下面我們開始來示範
3.slot_and_signal.py
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, QVBoxLayout, QFormLayout


class MainWindow(QWidget):

    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi()
        self.show()

    def setupUi(self):
        self.setWindowTitle("信號的使用!")

        self.button_hello = QPushButton()
        self.button_hello.setText("hello")

        self.button_cancel = QPushButton()
        self.button_cancel.setText("cancel")

        self.line_hello = QLineEdit()

        form_layout = QFormLayout()
        form_layout.addRow(self.button_hello, self.line_hello)
        form_layout.addRow(self.button_cancel)

        h_layout = QVBoxLayout()
        h_layout.addLayout(form_layout)

        self.setLayout(h_layout)

        self.button_hello.clicked.connect(self.hello)
        self.button_cancel.clicked.connect(self.cancel)

    def hello(self):
        self.line_hello.setText("hello 我被觸發了")

    def cancel(self):
        self.line_hello.setText("")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    MainWindow = MainWindow()
    sys.exit(app.exec_())




執行結果如下

在這一章節,我們將較於Part.2只多做了兩件事情,
  • 觸發事件
  • 設定物件的文字屬性



self.button_hello.clicked.connect(self.hello)
self.button_cancel.clicked.connect(self.cancel)
這兩行程式暗藏的玄機眾多,以第一行舉例在Qt式的Python寫法相當於

QtCore.QObject.connect(self.button_hello, QtCore.SIGNAL("clicked()"), self.hello)
將 button_hello 的信號 clicked 與 self.hello這個function連結起來
但是因為配合習慣寫Python的人,所以多了一種對Python來說更好懂的寫法



def hello(self):
    self.line_hello.setText("hello 我被觸發了")

這邊就很簡單明瞭的設定屬性,因此信號的觸發在一開始很淺顯易懂的


這篇文章就介紹到這裡,之後將會介紹更多信號的使用,
另外寫PyQt沒有很豐富的文件資源,因此只能根據C++的文件寫成Python語法
但是相信我,之後會習慣的!



本章範例
如果有任何疑問或指教,歡迎底下回覆,謝謝。

PyQt5 教學 Part 2: Layout排版系統
PyQt5 教學 Part 4: 執行緒的使用