单击时如何获取 QMenu 项的名称?
How to get the name of a QMenu Item when clicked?
我在 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()
方法,即 returns 发出信号的 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
,那么您可以使用 QMenu
的 triggered
信号,这会发送 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
信号不同于 QMenu
triggered
信号,在第一个信号的情况下,它发送一个布尔值,指示是否 QAction
被选中(默认情况下 QAction
是不可选中的,如果你想激活它你必须使用 setCheckable(True)
)并且在第二种情况下它发送被按下的 QAction
属于 QMenu
。这就是为什么你总是得到 False 的原因,如果你不想遇到那个问题,你必须使用我的第一个方法 sender()
。另一方面,在 Qt 中你很少需要使用 try-except,实际上你不应该在 Qt 的世界中使用它,因为它有 Qt 不想要的额外成本,另一方面它隐藏了原因的错误,作为建议,当没有其他解决方案时使用 try-except,而在 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_())
我在 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()
方法,即 returns 发出信号的 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
,那么您可以使用 QMenu
的 triggered
信号,这会发送 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
信号不同于 QMenu
triggered
信号,在第一个信号的情况下,它发送一个布尔值,指示是否 QAction
被选中(默认情况下 QAction
是不可选中的,如果你想激活它你必须使用 setCheckable(True)
)并且在第二种情况下它发送被按下的 QAction
属于 QMenu
。这就是为什么你总是得到 False 的原因,如果你不想遇到那个问题,你必须使用我的第一个方法 sender()
。另一方面,在 Qt 中你很少需要使用 try-except,实际上你不应该在 Qt 的世界中使用它,因为它有 Qt 不想要的额外成本,另一方面它隐藏了原因的错误,作为建议,当没有其他解决方案时使用 try-except,而在 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_())