使用QAction而不将其添加到菜单(或工具栏)

5 投票
1 回答
3817 浏览
提问于 2025-04-15 13:56

我正在尝试开发一个应用程序,想要采用非常模块化的命令方式。因为我在使用pyqt,所以我觉得使用QAction来绑定快捷键会很不错。
不过,似乎只有当这个动作在菜单或工具栏中可见时,快捷键才会生效。有没有人知道怎么让这个动作在不可见的情况下也能工作呢?
下面是一些示例代码,展示了我正在尝试的内容。
谢谢,

安德烈

from PyQt4 import *
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class TesteMW(QMainWindow):
    def __init__(self, *args):
        QMainWindow.__init__(self, *args)
        self.create_action()

    def create_action(self):
        self.na = QAction(self)
        self.na.setText('Teste')
        self.na.setShortcut('Ctrl+W')
        self.connect(self.na, SIGNAL('triggered()'), self.action_callback)
        # uncomment the next line for the action to work
        # self.menuBar().addMenu("Teste").addAction(self.na)

    def action_callback(self):
        print 'action called!'


app = QApplication(sys.argv)
mw = TesteMW()
mw.show()

app.exec_()

1 个回答

9

在你处理某个动作之前,得先把这个动作添加到一个小部件(widget)上。根据QT的文档,关于QAction的说明是:

动作是通过 QWidget::addAction() 或 QGraphicsWidget::addAction() 来添加到小部件上的。需要注意的是,动作必须在使用之前先添加到小部件上;如果快捷键是全局的(也就是Qt::ApplicationShortcut作为Qt::ShortcutContext),这点也是适用的。

这并不意味着这些动作会作为菜单项或者其他什么东西可见——只是说它们会作为小部件事件循环的一部分被处理。

撰写回答