首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在单击时获取QMenu项的名称?

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

Stack Overflow用户
提问于 2018-09-27 05:08:01
回答 1查看 7.2K关注 0票数 3

我试图将QMenu中的一些操作连接到一个方法;还有一些不相关的操作。

代码语言:javascript
复制
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()为接收方法提供一个更简洁的名称,但这似乎不能正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-27 05:15:46

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

代码语言:javascript
复制
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_())

如果您要连接QMenu的所有QAction,则可以使用QMenutriggered信号,这将发送按下的QAction

代码语言:javascript
复制
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信号与QMenu triggered信号不同,在第一种情况下,它发送一个布尔值,指示QAction是否被检查(默认情况下,QAction是不可检查的,如果要激活它,必须使用setCheckable(True)),而在第二种情况下,它发送属于QMenu的按下的QAction。这就是为什么您总是得到False,如果您不想有这个问题,您必须使用我使用sender()的第一个方法。另一方面,在Qt中,你很少使用try-除非,实际上你永远不应该在Qt的世界中使用它,因为这有一个Qt不想要的额外成本,另一方面它隐藏了错误的原因,作为建议使用try-除非没有其他解决方案,在Qt的情况下,几乎总是有另一个选择。

代码语言:javascript
复制
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, checked):
        action = self.sender()
        print(action.text())
        print(action.data())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.setGeometry(600, 100, 300, 100)
    window.show()
    sys.exit(app.exec_())
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52526040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档