【问题标题】:Assign keyboard shortcut to QLineEdit from Qt Designer从 Qt Designer 为 QLineEdit 分配键盘快捷键
【发布时间】:2023-03-19 15:45:01
【问题描述】:

我有一个在 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】:

最简单的方法是使用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 被按下的信息。

【讨论】:

  • 非常感谢。我有点放弃并做了 def keyPressEvent(self, e): 功能方式(来自我提供的两个链接)。唯一的缺点是它没有检查 lineedit 的焦点,但我认为没关系。如果我重新排列我的代码,我肯定会使用您提供的解决方案。再次感谢@ekhumoro!
猜你喜欢
  • 1970-01-01
  • 2012-08-24
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 2014-02-12
  • 2011-03-01
相关资源
最近更新 更多