亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用lambda表達式連接pyqt中的插槽

使用lambda表達式連接pyqt中的插槽

幕布斯6054654 2019-08-19 16:40:04
使用lambda表達式連接pyqt中的插槽我正在嘗試使用lambda函數連接插槽,但它沒有按照我期望的方式工作。在下面的代碼中,我成功正確連接前兩個按鈕。對于我在循環中連接的后兩個,這是錯誤的。在我之前有人有同樣的問題,但這個解決方案對我不起作用。我一直盯著我的屏幕半小時,但我無法弄清楚我的代碼是如何不同的。class MainWindow(QtGui.QWidget):     def __init__(self):         super(QtGui.QWidget, self).__init__()         main_layout = QtGui.QVBoxLayout(self)         # Works:         self.button_1 = QtGui.QPushButton('Button 1 manual', self)         self.button_2 = QtGui.QPushButton('Button 2 manual', self)         main_layout.addWidget(self.button_1)         main_layout.addWidget(self.button_2)         self.button_1.clicked.connect(lambda x:self.button_pushed(1))         self.button_2.clicked.connect(lambda x:self.button_pushed(2))         # Doesn't work:         self.buttons = []         for idx in [3, 4]:             button = QtGui.QPushButton('Button {} auto'.format(idx), self)             button.clicked.connect(lambda x=idx: self.button_pushed(x))             self.buttons.append(button)             main_layout.addWidget(button)     def button_pushed(self, num):         print 'Pushed button {}'.format(num)按下前兩個按鈕會產生'Pushing button 1'和'Pushing button 2',另外兩個按鈕都會產生'Pushed button False',雖然我預計會有3和4。我還沒有完全理解lambda機制。究竟有什么聯系?指向由lambda生成的函數的指針(使用參數替換)或者是在信號觸發時評估的lambda函數?
查看完整描述

3 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

所述QPushButton.clicked信號發射指示按鈕的狀態的參數。當您連接到lambda插槽時,您指定的可選參數將idx被按鈕的狀態覆蓋。

相反,請將您的連接設為

button.clicked.connect(lambda state, x=idx: self.button_pushed(x))

這樣就忽略了按鈕狀態,并將正確的值傳遞給您的方法。


查看完整回答
1 反對 回復 2019-08-19
  • 3 回答
  • 0 關注
  • 2081 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號