从Qt Designer为QLineEdit指定键盘快捷键

问题描述 投票:1回答:1

我有一个在Qt Designer中设计的表单(使用PyQt5)。我在那里使用行编辑来输入一些输入。我想要的是添加在行编辑中使用键盘组合(类似Ctrl + B或其中一个功能键)的功能。一旦按下该组合或功能键,我将运行一个函数/方法,将以“特殊”方式粘贴剪贴板内容(这意味着它将过滤并调整剪贴板中的值)。

这看起来很简单,很多人之前一定都在做这种事情。但我无法找到一种单一,简单,易懂的方式来做我想做的事。这是我正在寻找的那种解决方案。以下是包含MainForm代码的类:

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

def my_func(self):
    pass

我编造了keyboard_key_pressed部分(和其他人)让你了解我的目标。像上面的例子一样,有一种直截了当的做法吗?

python keyboard-shortcuts pyqt5 qt-designer qlineedit
1个回答
1
投票

最简单的方法是使用QShortcut

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

仅当窗口小部件具有键盘焦点时才会激活此选项。

你也可以使用event-filter来实现同样的目的。这提供了更大的灵活性,允许您监听给定窗口小部件的所有events并以您想要的任何方式修改默认行为(如果有)。在使用您不能(或不愿意)子类的小部件时,此方法非常有用。

代码看起来像这样:

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,其中(除其他外)提供有关特定modifierskey被按下的信息。

© www.soinside.com 2019 - 2024. All rights reserved.