在Qt中,控件中的clicked()信號和clicked(bool)信號是兩個不同的信號,映射槽函數時,clicked()信號映射到的槽函數是不帶參的,clicked(bool)信號映射到的槽函數是帶參數的。
經驗證測試,如果把一個控件的clicked()信號和clicked(bool)信號映射到名字相同但參數不同的槽函數會導致二者最終會執行同一個槽函數,具體執行哪個槽函數由代碼中槽函數的定義順序決定,執行的是后定義的槽函數。
我們來驗證一下,在一個PushButtong上分別定義這兩個信號與槽函數的連接,它們連接到同名的槽函數clickButton,如圖:
槽函數定義代碼如下:
python
def clickButtonNoPar(self):
pButton = self.sender()
print(f"clickButtonNoPar was called!")
def clickButton(self,status):
pButton = self.sender()
print(f"clickButton was called,status={status}")
在PyCharm執行情況如下:
上圖中,藍筆圈的部分是槽函數的定義代碼,黃色熒光筆標記時執行的輸出,可以看到,按鈕的clicked()信號和clicked(bool)信號映射到同名(clickButton)但參數不同的槽函數會導致二者最終會執行同一個槽函數clickButton(self,status)。如果把上述槽函數的定義代碼順序倒換一下,就會執行槽函數clickButton(self)。
當然,如果二者映射到不同槽函數,這個問題就不會存在。
之所以出現這個問題,老猿認為是PyQt內部槽函數映射機制存在缺陷導致的。

博客地址:https://blog.csdn.net/LaoYuanPython
老猿Python博客文章目錄:https://blog.csdn.net/LaoYuanPython/article/details/98245036