PyQt5 (Python):通过 contextmenu 从 qpushbutton 获取值

Posted

技术标签:

【中文标题】PyQt5 (Python):通过 contextmenu 从 qpushbutton 获取值【英文标题】:PyQt5 (Python): Get value from qpushbutton by contextmenu 【发布时间】:2015-12-20 11:44:21 【问题描述】:

我在for 循环中创建了几个qpushbuttons。我想要做的是通过上下文菜单访问它们的值(for循环迭代的数字)。

我可以创建按钮并通过左键单击来打印它们的值。但是当我右键单击打开上下文菜单时,触发的命令self.value.triggered.connect(partial(self.get_value, number)) 只返回最大值。

为了通过上下文菜单中的get_value 条目获取值,我必须进行哪些更改?

import sys
from functools import partial
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication, QAction, QMenu
from PyQt5.QtCore import Qt

class Main(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):      
        self.buttons = []
        self.value = []
        self.context_menu = []
        pos_value = [30, 50]
        for number in range(0,4):
            button_text = "Button " + str(number)
            self.buttons.append(QPushButton(button_text, self))
            self.buttons[number].move(*pos_value)
            self.buttons[number].clicked.connect(self.buttonClicked)
            pos_value[0] += 120

            self.buttons[number].setContextMenuPolicy(Qt.CustomContextMenu)
            self.buttons[number].customContextMenuRequested.connect(partial(self.open_context_menu, number))
            self.context_menu.append(QMenu(self))
            self.value.append(QAction('Get value ' + str(number), self))
            self.context_menu[-1].addAction(self.value[-1])
            self.value[-1].triggered.connect(partial(self.get_value, number))

        self.setGeometry(300, 300, 600, 150)
        self.show()

    def buttonClicked(self):
        sender = self.sender()
        print(sender.text() + ' was pressed')

    def get_value(self, value):
        print('Value ' + str(value))

    def open_context_menu(self, i, point):
        self.context_menu[-1].exec_(self.buttons[i].mapToGlobal(point))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())

编辑:我在我的程序中发现了一个错误,因为我已经覆盖了变量 self.value 和 self.context_menu。现在这已修复,但错误仍然存​​在。

任何想法如何解决这个问题?

【问题讨论】:

【参考方案1】:
def open_context_menu(self, i, point):
    self.context_menu[-1].exec_(self.buttons[i].mapToGlobal(point))
#                     ^
#               Your bug here

【讨论】:

非常感谢:self.context_menu[i].exec_(self.buttons[i].mapToGlobal(point)) 是我的问题的解决方案

以上是关于PyQt5 (Python):通过 contextmenu 从 qpushbutton 获取值的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 Python:如何通过 MySQL 查询结果中的单个数据行

通过Pyqt5 python保存文件[重复]

python通过PyQt5实现登录界面

3. PyQt5-通过Python脚本把当前目录下的所有.ui文件转换为.py文件

Python:“PyQt5.QtCore.pyqtSignal”对象没有属性“连接”

Python3+Pycharm+PyQt5环境搭建