列出 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']

一道加分题:

[edit] 因为似乎没有本地解决方案,所以我启动了一个小部件 here

有简单的解决方法吗?

没有本地方法可以找到 window 中的所有快捷方式,因此您的方法是正确的。

我不明白为什么 'my toolbar' 在这里被列为 QAction?

并非每个 QAction 都意味着有一个关联的 QShortcut,在 QToolBar 的情况下,它已经有一个默认的 QAction,即 toggleViewAction(),这是您获得的并且没有关联的快捷方式。