python - Qt 菜单快捷方式抢占子部件 KeyPressEvents

标签 python pyqt keyboard-shortcuts

我有一个主窗口,我在其中建立了标准的“编辑”>“剪切/复制/粘贴”操作,菜单操作链接到 QTextEdit 的相关插槽,它是主窗口的子窗口。

主窗口有一个不同的子窗口(在拆分器的另一侧),它显示一个 TableView。此小部件具有单击以聚焦的聚焦策略和 KeyPressEvent 处理程序。当这个 child 获得焦点时,它的 KeyPressEvent 方法拦截所有击键事件(我知道,因为它在控制台上打印出来)除了 ctl-c、ctl-v 和分配给编辑或文件菜单操作的任何其他键序列.这些击键进入菜单并在没有焦点的 QTextEdit 中生效。

我希望能够在 TableView 中捕获 ^c 以复制表选择的值,但键序列永远不会到达那里。

我该怎么做才能使 ^c 操作对具有焦点的小部件可见?

最佳答案

创建编辑操作时,给它们一个 WidgetShortcut上下文和 add them与它们关联的小部件:

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

请注意,以这种方式配置的操作快捷方式不会覆盖关联小部件可能具有的任何内置快捷方式。

编辑

这是一个简单的演示。请注意,当 text-edit 具有键盘焦点时,“Ctrl+P”将触发处理程序,但“Ctrl+C”不会,因为它是内置快捷方式。当 table 具有键盘焦点时,“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_())

关于python - Qt 菜单快捷方式抢占子部件 KeyPressEvents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8275276/

相关文章:

python - 如何识别连接到AF_UNIX套接字的客户端?

python - Python 中的偏相关

python - 如何使用连接模块运行 PyQt 应用程序?

java - Java中的自定义键盘快捷键

visual-studio - 使用简单的键盘快捷键进行 Visual Studio 注释和取消注释

vim - 普通模式下Control+空格vim键绑定(bind)不起作用

python - 如何在 MAC 上用 python 打开 Excel 实例?

python - Django ORM 对两列求和以填充第三列

python - PyQt - 另一个线程中的对话框

python - PyQt:如何找到适用于 Ubuntu Unity 的菜单文本颜色?