我在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()
为操作指定一个更清晰的接收方法名称,但这似乎无法正常工作。
答案 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
),在第二种情况下,它将发送被按下的QAction
到QAction
。这就是为什么您总是会得到False的原因,如果您不想遇到该问题,则必须使用我的第一种方法使用setCheckable(True)
。另一方面,在Qt中,您很少需要使用try-except,实际上,您永远不应该在Qt的世界中使用它,因为它具有Qt所不希望的额外费用,另一方面,它掩盖了原因对于错误,建议在没有其他解决方案的情况下使用try-except,对于Qt,几乎总是有其他选择。
QAction