首先我們先去教學文件裡面,尋找按鈕可以使用的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_())
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: 執行緒的使用
我剛學pyqt5
回覆刪除覺得你寫得很棒又好懂!!
請問還會繼續寫pyqt5的文章嗎??
感謝你的支持哦
刪除有空的話會再補充一些唷
快的話下個星期
下次的教學大概是PyQT5 多執行緒的使用
之後就會教一些工具 UI Designer 畢竟全部物件都用程式刻劃會有點麻煩