Skip to main content
 首页 » 编程设计

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

2025年05月04日12pengyingh

我有一个主窗口,我在其中建立了标准的“编辑”>“剪切/复制/粘贴”操作,菜单操作链接到 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_())