上一篇我們設計了 81 個按鈕, 所以會產生81 個訊號, 如果對應的結果是完全相同當然只要寫一個槽就好了
但如果對應的結果只是相似, 但不完全要同要如何處理呢?
我們先來demo 要如何產生 81 個訊號, 這部分是我 try 很久的
#import 用到的 package
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QGridLayout, QPushButton,QMessageBox
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot
#定義 主windows
def window():
app = QApplication(sys.argv)
win = QWidget()
grid = QGridLayout()
dict =[]
for i in range(0,9):
for j in range(0,9):
k = QPushButton(str(i+1)+"*"+str(j+1))
grid.addWidget(k,i,j) #將button 加入 widget
print(k)
k.clicked.connect(showMessage) #將 push button 訊號指向 show Message 槽
win.setLayout(grid) # 將 grid 加入 windows
win.setWindowTitle("PyQt Grid Example")
win.setGeometry(50,50,200,200)
win.show()
sys.exit(app.exec_())
#Show Message 的內容跟前幾篇提到的 QMessage 相同
def showMessage():
print("clicked")
msgBox = QMessageBox()
msgBox.setIcon(QMessageBox.Information)
msgBox.setText("Button is clicked")
msgBox.setWindowTitle("QMessageBox Example")
msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
# msgBox.buttonClicked.connect(msgButtonClick)
msgBox.exec()
msgBox.show()
if __name__ == '__main__':
window()
上面的 Signal 與 Slot ,看起來很簡單吧, 但是為何我會 Try 很久呢?
主要是因為我把 clicked.connect 與 show Message 放在另一個程式, 這個時候我的
k.clicked.connect 中的 K 需要把它指定為QPushbutton 才能, 而不能只是一個變數
另外外部呼叫的所以每一個 button 都要有一個變數, 不然他不知道要指向哪裡
之所以我會把Signal 與 Slot 是因為 UI 是用 QT Designer 產生的, 且 Signal 與 Slot 教父複雜
所以想分開寫
但如果可以想寫一起, 會簡潔很多
另一個原因是 Slot 其實有限制, 這邊呼叫的都是相同的內容
所以簡單很多,
如果是要用一個Slot function , 帶不同的參數,以對應不同的結果那就要小心了
因為 呼叫slot 時不能帶參數的, 這跟一般 function 呼叫不同
但解法很簡單 下一篇會解釋
沒有留言:
張貼留言