Ярлыки меню Qt выгружают дочерний виджет KeyPressEvents - PullRequest
2 голосов
/ 26 ноября 2011

У меня есть главное окно, в котором я устанавливаю стандартные действия Правка> Вырезать / Копировать / Вставить, с действиями меню, связанными с соответствующими слотами QTextEdit, который является дочерним по отношению к главному окну.

Главное окно имеет другого дочернего элемента (на другой стороне разделителя), который отображает TableView. Этот виджет имеет политику фокуса «клик для фокуса» и обработчик KeyPressEvent. Когда этот дочерний элемент имеет фокус, его метод KeyPressEvent перехватывает все события нажатия клавиш (я знаю, потому что он выводит их на консоль), КРОМЕ - ctl-c, ctl-v и любые другие последовательности клавиш, которые назначены действиям редактирования или меню файла , Эти нажатия клавиш идут в меню и действуют внутри QTextEdit, который не имеет фокуса.

Я хочу иметь возможность перехватить ^ c в табличном представлении, чтобы скопировать значение выбранной таблицы, но последовательность клавиш там не доходит.

Что я могу сделать, чтобы действие ^ c стало видимым для виджета с фокусом?

1 Ответ

1 голос
/ 26 ноября 2011

Когда действия редактирования созданы, дайте им контекст WidgetShortcut и добавьте их к виджету (ам), с которым они должны быть связаны:

copyAction.setShortcutContext(Qt.WidgetShortcut)
editor.addAction(copyAction)

Обратите внимание, что ярлыки действий, настроенных таким образом, не будут переопределять любые из встроенных ярлыков, которые могут иметь связанные виджеты.

РЕДАКТИРОВАТЬ

Вотпростая демонстрацияОбратите внимание, что, когда text-edit имеет фокус клавиатуры, Ctrl + P запустит обработчик, а Ctrl + C - нет, потому что это встроенный ярлык.Когда таблица имеет фокус клавиатуры, Ctrl + C скопирует выбранный элемент как обычно, но Ctrl + P ничего не сделает.

from PyQt4 import QtGui, QtCore

class Window(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        widget = QtGui.QWidget(self)
        self.setCentralWidget(widget)
        layout = QtGui.QVBoxLayout(widget)
        self.edit = QtGui.QTextEdit(self)
        self.edit.setText('text')
        self.table = Table(self)
        layout.addWidget(self.edit)
        layout.addWidget(self.table)
        menu = self.menuBar().addMenu('&File')
        def add_action(text, shortcut):
            action = menu.addAction(text)
            action.setShortcut(shortcut)
            action.triggered.connect(self.handleAction)
            action.setShortcutContext(QtCore.Qt.WidgetShortcut)
            self.edit.addAction(action)
        add_action('&Copy', 'Ctrl+C')
        add_action('&Print', 'Ctrl+P')

    def handleAction(self):
        print ('Action!')

class Table(QtGui.QTableWidget):
    def __init__(self, parent):
        QtGui.QTableWidget.__init__(self, parent)
        self.setRowCount(4)
        self.setColumnCount(2)
        self.setItem(0, 0, QtGui.QTableWidgetItem('item'))

    def keyPressEvent(self, event):
        print ('keyPressEvent: %s' % event.key())
        QtGui.QTableWidget.keyPressEvent(self, event)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())
...