我试图使用for for循环自动生成菜单:
q3 = connect_menu.addMenu('Q3')
q3menus = {}
x = 0
for element in q3s:
key = 'Q'+str(x)
q3menus[key] = QAction(element[7], self)
q3.addAction(q3menus[key])
q3menus[key].triggered.connect(lambda: self.main_form.consavesv(q3menus[key].text()))
x += 1
q3s
等于从最后一个SQL查询获取数据的Fetchall函数
q3s = [(1, 'Q3', '127.0.0.1', 28960, "Server Test Name", '5154', '127.0.0.1:28960', "127.0.0.1:28960 | Server Test Name"), (2, 'Q3', '192.168.1.66', 28960, 'Server Test 2', '5154', '192.168.1.66:28960', '192.168.1.66:28960 | Server Test 2')]
我尝试使用一个dictianory,这个dictianory添加了菜单标签,但是当我点击它们时,我们都有与最后一个相同的triggered.connect()
..
我做错了什么? 我不想在这里自己创建信号,因为数据库结果不是静态的..
抱歉英语不好。
答案 0 :(得分:1)
问题是你将参数传递给lambda函数的方法,正确的语法是:
f = lambda p_1, p_2, ..., p_n: some operation with p_1, p_2, ..., p_n
在您的情况下,您还必须考虑QAction
的触发信号返回一个名为checked的值,因此您必须在该参数之前,如下所示:
q3menus[key].triggered.connect(lambda checked, key=key: self.main_form.consavesv(q3menus[key].text()))
除了这种方法,您还可以使用sender()
方法返回发出信号的对象并直接获取文本,如下例所示:
class Example(QMainWindow):
def __init__(self, parent = None):
QMainWindow.__init__(self, parent)
q3s = [(1, 'Q3', '127.0.0.1', 28960, "Server Test Name", '5154', '127.0.0.1:28960', "127.0.0.1:28960 | Server Test Name"),
(2, 'Q3', '192.168.1.66', 28960, 'Server Test 2', '5154', '192.168.1.66:28960', '192.168.1.66:28960 | Server Test 2')]
menubar = self.menuBar()
q3 = menubar.addMenu("Q")
q3menus = {}
for x, element in enumerate(q3s):
key = 'Q'+str(x)
q3menus[key] = QAction(element[7], self)
q3.addAction(q3menus[key])
q3menus[key].triggered.connect(lambda checked, key=key : self.someFunction(q3menus[key].text()))
q3menus[key].triggered.connect(self.anotherFuntions)
def someFunction(self, text):
print("someFunction {}".format(text))
def anotherFuntions(self):
print("anotherFuntions {}".format(self.sender().text()))
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Example()
w.show()
sys.exit(app.exec_())