python - 与 Qt/PyQt 中的 KeyPress 事件相比,如何加快 QPushButton 的按下信号的延迟?
问题描述
我有一个 PyQt-GUI,它具有将通过pressed
-signal 连接到 QPushButton 和通过QEvent.KeyPress
-event 连接到键盘上的键的对象的功能。但是,我注意到单击 PushButton 后对象移动严重滞后,如果我按键盘上的指定键则不会出现这种情况。
- 你能解释一下为什么同一个函数的执行速度比按键事件慢吗?
- 有没有办法让 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_())
解决方案
推荐阅读
- ffmpeg - 使用 openRTSP 和 ffmpeg 录制视频
- vba - 获取从 Pivot 的显示详细信息创建的变量工作表名称
- c# - 保存除 binaryformatter.serialize 之外的自定义 C# 类(包含各种大小的列表/数组)的推荐过程?
- android - 编辑计划的待处理意图
- java - android studio:尝试在空对象引用上调用虚拟方法
- android-8.0-oreo - 奥利奥的缺口有问题吗?W/HwNotchSizeUtil:calculateSize 错误
- python - TestDome 数据科学:没有得到正确的答案
- c# - 告诉 Entity Framework 在生成实体时使用名称“Children”而不是“InverseParent”
- sql - H2 限制和偏移量,订购有保证吗?
- sql - 具有级联删除的两个表