【问题标题】:Using DataBase and Dict to Add Menus and Triggers使用 DataBase 和 Dict 添加菜单和触发器
【发布时间】:2018-03-05 21:42:40
【问题描述】:

我正在尝试使用此 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 等于一个 Fetchall 函数,从上一个 SQL Query 中获取数据

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')]

我尝试使用字典,该字典添加了菜单标签,但当我单击它们时,它们都具有与上一个相同的triggered.connect()..

我做错了什么?

我不想在这里自己创建信号,因为数据库结果不是静态的。

【问题讨论】:

  • 我想我应该在循环之外添加triggered.connect(),但我不知道应该如何为字典中的所有项目设置triggered.connect()
  • 你可以在运行print(q3s)时显示你得到的结果
  • @eyllanesc 问题已更新并添加了 q3s 内容

标签: python python-3.x sqlite pyqt pyqt5


【解决方案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_())

【讨论】:

  • 成功了!!你能帮我解释一下q3menus[key].triggered.connect(lambda checked, key=key : self.someFunction(q3menus[key].text()))吗?
  • 触发信号返回一个参数,表示是否已经检查过,因为QAction可以检查,但默认情况下不是,但我们必须考虑到它,然后我们必须传递其他参数通过分配它们,澄清以上等同于:q3menus[key].triggered.connect(lambda checked, param=key : self.someFunction(q3menus[param].text()))
猜你喜欢
  • 2013-06-22
  • 2023-02-26
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多