点击时如何获取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()为接收方法为操作提供一个更干净的名称,但这似乎无法正常工作。

一个可能的解决方案是使用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_())

如果要连接QMenu的所有QAction,则可以使用QMenutriggered信号 ,这将发送按下的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_())

更新:

QActiontriggered信号与QMenutriggered信号不同,在第一个信号的情况下,它发送一个布尔值,指示是否选中了QAction(默认情况下,QAction不可检查,如果要激活它,则必须使用setCheckable(True)(,在第二种情况下,它发送属于QMenu的按下QAction。这就是为什么你总是得到 False,如果你不想遇到这个问题,你必须使用我的第一个方法使用sender().另一方面,在Qt中,您很少必须使用try-exex,实际上您永远不应该在Qt世界中使用它,因为这具有Qt不想要的额外费用,另一方面,它隐藏了错误的原因,作为建议使用try-除非没有其他解决方案, 在Qt的情况下,几乎总是有另一种选择。

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_())

相关内容

  • 没有找到相关文章

最新更新