还在学习pyqt如何工作.我想动态生成customContextMenu并与函数连接.到目前为止,我得到以下,但连接部分不工作?
import sys from PyQt4 import QtGui, QtCore class MainForm(QtGui.QMainWindow): def __init__(self, parent=None): super(MainForm, self).__init__(parent) # create button self.button = QtGui.QPushButton("test button", self) self.button.resize(100, 30) # set button context menu policy self.button.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.connect(self.button, QtCore.SIGNAL('customContextMenuRequested(const QPoint&)'), self.on_context_menu) self.popMenu = QtGui.QMenu(self) def on_context_menu(self, point): self.popMenu.clear() #some test list for test testItems = ['itemA', 'itemB', 'itemC'] for item in testItems: action = self.btn_selectPyFilterPopMenu.addAction("Selected %s" % item) self.connect(action,QtCore.SIGNAL("triggered()"),self,QtCore.SLOT("printItem('%s')" % item)) self.popMenu.exec_(self.button.mapToGlobal(point)) @pyqtSlot(str) def printItem(self, item): print item def main(): app = QtGui.QApplication(sys.argv) form = MainForm() form.show() app.exec_() if __name__ == '__main__': main()
ekhumoro.. 14
你的代码几乎是对的.您只需要lambda
使用默认参数将信号连接到a ,如下所示:
for item in testItems: action = self.popMenu.addAction('Selected %s' % item) action.triggered.connect( lambda chk, item=item: self.printItem(item))
默认参数确保每个都lambda
获取当前循环变量的副本.另请注意,空元组用于指定chk
信号.如果没有这样做,triggered
信号将默认发送一个布尔值,这将破坏该item
参数lambda
.
最后,我希望在连接信号时使用新式语法 - 旧式可能非常容易出错,并且远不如pythonic.
你的代码几乎是对的.您只需要lambda
使用默认参数将信号连接到a ,如下所示:
for item in testItems: action = self.popMenu.addAction('Selected %s' % item) action.triggered.connect( lambda chk, item=item: self.printItem(item))
默认参数确保每个都lambda
获取当前循环变量的副本.另请注意,空元组用于指定chk
信号.如果没有这样做,triggered
信号将默认发送一个布尔值,这将破坏该item
参数lambda
.
最后,我希望在连接信号时使用新式语法 - 旧式可能非常容易出错,并且远不如pythonic.