首页 > 解决方案 > 与 Qt/PyQt 中的 KeyPress 事件相比,如何加快 QPushButton 的按下信号的延迟?

问题描述

我有一个 PyQt-GUI,它具有将通过pressed-signal 连接到 QPushButton 和通过QEvent.KeyPress-event 连接到键盘上的键的对象的功能。但是,我注意到单击 PushButton 后对象移动严重滞后,如果我按键盘上的指定键则不会出现这种情况。

  1. 你能解释一下为什么同一个函数的执行速度比按键事件慢吗?
  2. 有没有办法让 QPushButton 的执行速度更快/延迟更慢?

以下是相关代码的摘要:


class GUI(QtWidgets.QMainWindow):

  def __init__(self, control: 'Controler'):
    super(GUI, self).__init__()
    uic.loadUi("ressources/interface.ui", self)

    # Defining the QPushButton and connecting the signal with the function
    self.button_left = self.findChild(QtWidgets.QPushButton, "button_bbox_left")
    self.button_left.pressed.connect(lambda: self.translate_along_x(left=True))

  # Handling key_press_event with eventFilter
  def eventFilter(self, event_object, event):
    if (event.type() == QEvent.KeyPress) and (event.key() == QtCore.Qt.Key_A):
      self.translate_along_x(left=True)

  # The function that moves the object
  def translate_along_x(self, distance=0.05, left=False):
    if left:
      distance *= -1
    move_object(distance)

两个函数调用之间的一个区别是,对于 QPushButton,由于参数的原因,我必须使用 lambda 函数。但是如果我在没有 lambda 函数的情况下设置它,滞后仍然存在。

更新

正如@eyllanesc 建议的那样,我尝试创建一个最小的可重现示例。你在下面找到它。在那里我无法衡量一个显着的差异。所以(虽然它更简单)如果我多次重复单击按钮,它可能更像是 PyQt 没有执行所有点击。

那么是否有一个选项可以让按钮更好地处理许多快速点击?

MRE:

import sys, time
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QPushButton
from PyQt5.QtWidgets import QMainWindow

app = QApplication(sys.argv)

class MainWindow(QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)

        button = QPushButton("Click me")
        self.setCentralWidget(button)
        self.start = None
        
        button.pressed.connect(self.button_clicked)
        
    def button_clicked(self):
        self.start = time.time()
        self.do_sth()
        
        
    def keyPressEvent(self, event):
        self.start = time.time()
        self.do_sth()
        
    def do_sth(self):
        print("Reacted to signal/ event!")
        print("Took %s seconds!" % str(time.time()-self.start))
        
window = MainWindow()
window.show()
sys.exit(app.exec_())

标签: pythonqtpyqtpyqt5

解决方案


推荐阅读