单击时如何获取QMenu项的名称?

时间:2018-09-26 21:08:01

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

我在QMenu中有一些尝试连接到单个方法的操作;还有其他无关的动作。

import sys
from PyQt5.QtWidgets import *


class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()

        layout = QGridLayout(self)
        self.menu_bar = QMenuBar()
        self.menu = QMenu('MENU', self)

        self.menu_action = QAction('Option #1', self)
        self.menu_action.setData('option1')
        self.menu_action.triggered.connect(self.actionClicked)

        self.menu.addAction(self.menu_action)
        self.menu_bar.addMenu(self.menu)
        layout.addWidget(self.menu_bar)

    def actionClicked(self, action):
        print(action)

        try:
            print(action.text())
        except AttributeError as e:
            print(e)

        try:
            print(action.data())
        except AttributeError as e:
            print(e)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 300, 100)
    window.show()
    sys.exit(app.exec_())

我想知道如何在调用该方法时知道单击了哪些操作。目前,我正在尝试使用self.menu_action.setData()为操作指定一个更清晰的接收方法名称,但这似乎无法正常工作。

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是使用sender()方法,该方法返回发出信号的QObject,在这种情况下为QAction

import sys
from PyQt5 import QtCore, QtWidgets


class Window(QtWidgets.QWidget):
    def __init__(self):
        super(Window, self).__init__()

        layout = QtWidgets.QGridLayout(self)
        menubar = QtWidgets.QMenuBar()
        filemenu = menubar.addMenu('MENU')

        filemenu.addAction('Option #1', self.actionClicked)
        filemenu.addAction('Option #2', self.actionClicked)
        layout.addWidget(menubar)

    @QtCore.pyqtSlot()
    def actionClicked(self):
        action = self.sender()
        print('Action: ', action.text())


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 300, 100)
    window.show()
    sys.exit(app.exec_())

如果要连接QAction的所有QMenu,则可以使用triggered的{​​{1}}信号,这将发送{{1} }。

QMenu

更新:

QAction import sys from PyQt5 import QtCore, QtWidgets class Window(QtWidgets.QWidget): def __init__(self): super(Window, self).__init__() layout = QtWidgets.QGridLayout(self) menubar = QtWidgets.QMenuBar() filemenu = menubar.addMenu('MENU') filemenu.triggered.connect(self.actionClicked) filemenu.addAction('Option #1') filemenu.addAction('Option #2') layout.addWidget(menubar) @QtCore.pyqtSlot(QtWidgets.QAction) def actionClicked(self, action): print('Action: ', action.text()) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) window = Window() window.setGeometry(600, 100, 300, 100) window.show() sys.exit(app.exec_()) 信号与QAction triggered信号不同,在第一个信号的情况下,它会发送一个布尔值,该值指示{{1 }}被选中(默认情况下QMenu是不可选中的,如果要激活它,则必须使用triggered),在第二种情况下,它将发送被按下的QActionQAction。这就是为什么您总是会得到False的原因,如果您不想遇到该问题,则必须使用我的第一种方法使用setCheckable(True)。另一方面,在Qt中,您很少需要使用try-except,实际上,您永远不应该在Qt的世界中使用它,因为它具有Qt所不希望的额外费用,另一方面,它掩盖了原因对于错误,建议在没有其他解决方案的情况下使用try-except,对于Qt,几乎总是有其他选择。

QAction