如何解决Qt.Key_Space不触发
尝试创建计时器时,我想使用Space
激活我创建的计时器功能:
def keyReleaseEvent(self,e):
# if e.key() == Qt.Key_Space:
if (e.key() == Qt.Key_T):
self.isCounting = not self.isCounting
if self.isCounting == True:
self.timerStart = time.time()
else:
#return elapsed time
print(time.time() - self.timerStart)
但是,这不起作用。我使用的其他任何按钮,即“ t”,“ 0”等...起作用。缺省情况下是否还有其他使用Space
的东西,或者什么可能导致此问题?
MRE:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import time
import sys
class Listener(QObject):
def __init__(self,button):
super().__init__(button)
self._button = button
self.button.installEventFilter(self)
@property
def button(self):
return self._button
def eventFilter(self,obj,event):
if obj is self.button and event.type() == QEvent.KeyPress:
return True
return super().eventFilter(obj,event)
class App(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.SCREEN_WIDTH = 1920
self.SCREEN_HEIGHT = 1080
self.WIN_HEIGHT = self.SCREEN_HEIGHT*.8
self.WIN_WIDTH = self.SCREEN_WIDTH/2
self.isCounting = False
self.timerStart = time.time()
self.setGeometry(self.SCREEN_WIDTH/2-self.WIN_WIDTH/2,self.SCREEN_HEIGHT/2-self.WIN_HEIGHT/2,self.WIN_WIDTH,self.WIN_HEIGHT)
self.setWindowTitle('Timer')
scrambleButton = QPushButton(self)
scrambleButton.setText('New Scramble')
scrambleButtonGeometry = QRect(self.WIN_WIDTH/2-65,80,130,35)
scrambleButton.setGeometry(scrambleButtonGeometry)
scrambleButton.clicked.connect(lambda: print('hey'))
listener = Listener(scrambleButton)
self.show()
def keyReleaseEvent(self,e):
# if e.key() == Qt.Key_Space:
if (e.key() == Qt.Key_T):
self.isCounting = not self.isCounting
if self.isCounting == True:
self.timerStart = time.time()
else:
#return elapsed time
print(time.time() - self.timerStart)
def main():
app = QApplication(sys.argv)
win = App()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
解决方法
问题是,尽管KeyPress事件没有发送到QPushButton,但是它不会被忽略,因此不会通知窗口。解决方案是忽略eventFilter中的keyPress和keyRelease:
def eventFilter(self,obj,event):
if obj is self.button and event.type() == QEvent.KeyPress:
event.ignore()
return True
if obj is self.button and event.type() == QEvent.KeyRelease:
event.ignore()
return super().eventFilter(obj,event)
一个更简单的解决方案是使用QShortcut:
# ...
self.show()
shorcut = QShortcut(Qt.Key_Space,self,autoRepeat=False)
shorcut.activated.connect(self.process_time)
def process_time(self):
self.isCounting = not self.isCounting
if self.isCounting == True:
self.timerStart = time.time()
else:
print(time.time() - self.timerStart)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。