列出 QMainWindow 的所有快捷方式
list all shortcuts of a QMainWindow
我有一个越来越大的 PySide2 应用程序,我想转储所有快捷方式。
有没有简单的解决办法?
第一个 objective 是能够列出它们(比方说检查它们是否全部记录在案并且没有重复),但我很快就会有兴趣让用户自定义它们(所以如果有人有快捷编辑器的例子,我也会感兴趣;我暂时只找到这个 https://doc.qt.io/archives/qq/qq14-actioneditor.html)。
这个post Qt - Disable/enable all shortcuts建议findChildren
,所以我想出了一个解决方案的开始(见下面的代码),但我觉得可能会有一些东西原生包含在 Qt 中,我可能错过了?
# This is file mygui.py
import sys
from PySide2.QtWidgets import QAction, QMessageBox, QMainWindow, QApplication
from PySide2.QtGui import QIcon, QKeySequence
class MyGUI(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('My GUI')
self.fileMenu = self.menuBar().addMenu('&File')
self.toolBar = self.addToolBar('my toolbar')
act = QAction('About', self)
act.triggered.connect(self.popup_hello)
act.setShortcuts(['Ctrl+A'])
for x in [self.fileMenu, self.toolBar]: x.addAction(act)
act = QAction('Show shortcuts', self)
act.triggered.connect(self.display_shortcuts)
for x in [self.fileMenu, self.toolBar]: x.addAction(act)
act = QAction('Quit', self, icon=QIcon.fromTheme('exit'))
act.setShortcuts(QKeySequence.Quit)
act.triggered.connect(self.close)
for x in [self.fileMenu, self.toolBar]: x.addAction(act)
def popup_hello(self):
self.statusBar().showMessage('Bienvenue')
QMessageBox.about(self, 'About', 'This is my GUI. v0.1')
def display_shortcuts(self):
for action in self.findChildren(QAction) :
print(type(action), action.toolTip(), [x.toString() for x in action.shortcuts()])
if __name__ == '__main__':
qt_app = QApplication(sys.argv)
app = MyGUI()
app.show()
#app.dumpObjectTree()
app.display_shortcuts()
qt_app.exec_()
这显示:
$ python3 mygui.py
<class 'PySide2.QtWidgets.QAction'> File []
<class 'PySide2.QtWidgets.QAction'> my toolbar []
<class 'PySide2.QtWidgets.QAction'> About ['Ctrl+A']
<class 'PySide2.QtWidgets.QAction'> Show shortcuts []
<class 'PySide2.QtWidgets.QAction'> Quit ['Ctrl+Q']
一道加分题:
- 我不明白为什么 'my toolbar' 在这里被列为 QAction?
[edit] 因为似乎没有本地解决方案,所以我启动了一个小部件 here。
有简单的解决方法吗?
没有本地方法可以找到 window 中的所有快捷方式,因此您的方法是正确的。
我不明白为什么 'my toolbar' 在这里被列为 QAction?
并非每个 QAction 都意味着有一个关联的 QShortcut,在 QToolBar 的情况下,它已经有一个默认的 QAction,即 toggleViewAction(),这是您获得的并且没有关联的快捷方式。
我有一个越来越大的 PySide2 应用程序,我想转储所有快捷方式。 有没有简单的解决办法?
第一个 objective 是能够列出它们(比方说检查它们是否全部记录在案并且没有重复),但我很快就会有兴趣让用户自定义它们(所以如果有人有快捷编辑器的例子,我也会感兴趣;我暂时只找到这个 https://doc.qt.io/archives/qq/qq14-actioneditor.html)。
这个post Qt - Disable/enable all shortcuts建议findChildren
,所以我想出了一个解决方案的开始(见下面的代码),但我觉得可能会有一些东西原生包含在 Qt 中,我可能错过了?
# This is file mygui.py
import sys
from PySide2.QtWidgets import QAction, QMessageBox, QMainWindow, QApplication
from PySide2.QtGui import QIcon, QKeySequence
class MyGUI(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('My GUI')
self.fileMenu = self.menuBar().addMenu('&File')
self.toolBar = self.addToolBar('my toolbar')
act = QAction('About', self)
act.triggered.connect(self.popup_hello)
act.setShortcuts(['Ctrl+A'])
for x in [self.fileMenu, self.toolBar]: x.addAction(act)
act = QAction('Show shortcuts', self)
act.triggered.connect(self.display_shortcuts)
for x in [self.fileMenu, self.toolBar]: x.addAction(act)
act = QAction('Quit', self, icon=QIcon.fromTheme('exit'))
act.setShortcuts(QKeySequence.Quit)
act.triggered.connect(self.close)
for x in [self.fileMenu, self.toolBar]: x.addAction(act)
def popup_hello(self):
self.statusBar().showMessage('Bienvenue')
QMessageBox.about(self, 'About', 'This is my GUI. v0.1')
def display_shortcuts(self):
for action in self.findChildren(QAction) :
print(type(action), action.toolTip(), [x.toString() for x in action.shortcuts()])
if __name__ == '__main__':
qt_app = QApplication(sys.argv)
app = MyGUI()
app.show()
#app.dumpObjectTree()
app.display_shortcuts()
qt_app.exec_()
这显示:
$ python3 mygui.py
<class 'PySide2.QtWidgets.QAction'> File []
<class 'PySide2.QtWidgets.QAction'> my toolbar []
<class 'PySide2.QtWidgets.QAction'> About ['Ctrl+A']
<class 'PySide2.QtWidgets.QAction'> Show shortcuts []
<class 'PySide2.QtWidgets.QAction'> Quit ['Ctrl+Q']
一道加分题:
- 我不明白为什么 'my toolbar' 在这里被列为 QAction?
[edit] 因为似乎没有本地解决方案,所以我启动了一个小部件 here。
有简单的解决方法吗?
没有本地方法可以找到 window 中的所有快捷方式,因此您的方法是正确的。
我不明白为什么 'my toolbar' 在这里被列为 QAction?
并非每个 QAction 都意味着有一个关联的 QShortcut,在 QToolBar 的情况下,它已经有一个默认的 QAction,即 toggleViewAction(),这是您获得的并且没有关联的快捷方式。