Используйте QAction без добавления в меню (или на панель инструментов)

Я пытаюсь разработать приложение с очень модульным подходом к командам и подумал, что было бы неплохо, поскольку я использую 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_()

person Community    schedule 28.08.2009    source источник


Ответы (1)


Вам нужно добавить свое действие к виджету, прежде чем оно будет обработано. Из документации QT для QAction:

Действия добавляются к виджетам с помощью QWidget::addAction() или QGraphicsWidget::addAction(). Обратите внимание, что действие должно быть добавлено к виджету, прежде чем его можно будет использовать; это также верно, когда ярлык должен быть глобальным (т. е. Qt::ApplicationShortcut как Qt::ShortcutContext).

Это не означает, что они будут видны как пункт меню или что-то еще — просто они будут обрабатываться как часть цикла событий виджетов.

person Thomi    schedule 28.08.2009
comment
Кое-что, что только что меня зацепило: недостаточно создать QAction с QWidget в качестве его родителя — вам также нужно вызвать для него addAction(). - person the_mandrill; 07.02.2011