从 Qt Designer 为 QLineEdit 分配键盘快捷键

Assign keyboard shortcut to QLineEdit from Qt Designer

我有一个用 Qt Designer(使用 PyQt5)设计的表单。我在那里使用行编辑来输入一些输入。我想要的是在行编辑中添加使用键盘组合(类似于 Ctrl+B 或功能键之一)的功能。按下组合键或功能键后,我将 运行 a function/method 以 "special" 方式粘贴剪贴板内容(这意味着它将过滤和调整剪贴板中的值).

这看起来很容易,而且以前肯定有很多人做过这种事情。但我无法找到一种单一、简单、易于理解的方式来做我想做的事。这是我正在寻找的解决方案。以下是保存 MainForm 代码的 class 下:

self.ui.my_lineedit.keyboard_key_pressed.connect(self.my_func, ctrl+b)

def my_func(self):
    pass

我编写了 keyboard_key_pressed 部分(和其他部分),以便您了解我的目的。有没有像上面的例子一样直接做我想做的事情的方法?

最简单的方法是使用 QShortcut:

self.shortcut = QtWidgets.QShortcut(
    QtCore.QKeySequence('Ctrl+B'), self.ui.my_lineedit, self.my_func)

这只会在小部件具有键盘焦点时激活。

您还可以使用给定小部件的 event-filter to achieve the same thing. This provides much greater flexibilty, allowing you to listen in on all the events 并以您想要的任何方式修改默认行为(如果有)。当使用您不能(或不希望)sub-class.

的小部件时,这种方法非常有用

代码看起来像这样:

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        ...
        self.ui.my_lineedit.installEventFilter(self)

    def eventFilter(self, source, event):
        if (event.type() == QtCore.QEvent.KeyPress and
            source is self.ui.my_lineedit):
            if (event.modifiers() & QtCore.Qt.ControlModifier and
                event.key() == QtCore.Qt.Key_B):            
                self.my_func()
                # return True here to stop further processing
        return super(MainWindow, self).eventFilter(source, event)

这里的事件是 QKeyEvent, which (amongst other things) provides information about the specific modifiers and key 被按下。