pyqt动态生成QMenu动作并连接

 想翻身的咸鱼。。。 发布于 2023-02-12 18:37

还在学习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.

1 个回答
  • 你的代码几乎是对的.您只需要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.

    2023-02-12 18:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有