我有一个带有continue按钮的QDialog窗口。continue按钮是默认按钮,因为每当我按enter键时,都会按下continue按钮。我发现了一些奇怪的事情:当我按enter键三次时,continue按钮就会按三次。但是,当我第四次按下它时,整个窗口都关闭了。我在continue按钮的正下方有一个cancel按钮,用于关闭窗口,但我没有将cancel按钮设置为默认按钮或任何其他按钮。
我想重写keyPressEvent
,这样每当我在窗口中时,enter按钮将始终连接到continue按钮。
这就是我现在所拥有的:
class ManualBalanceUI(QtGui.QWidget):
keyPressed = QtCore.pyqtSignal()
def __init__(self, cls):
super(QtGui.QWidget, self).__init__()
self.window = QtGui.QDialog(None, QtCore.Qt.WindowSystemMenuHint)
self.ui = uic.loadUi('ManualBalanceUI.ui', self.window)
self.keyPressed.connect(self.on_key)
def keyPressEvent(self, event):
super(ManualBalanceUI, self).keyPressEvent(event)
self.keyPressed.emit(event)
def on_key(self, event):
if event.key() == QtCore.Qt.Key_Enter and self.ui.continueButton.isEnabled():
self.proceed() # this is called whenever the continue button is pressed
elif event.key() == QtCore.Qt.Key_Q:
self.window.close() # a test I implemented to see if pressing 'Q' would close the window
def proceed(self):
...
...
然而,现在这似乎并没有起到什么作用。按“q”不会关闭窗口,我也不知道“enter”键是否正常工作。
我之前看过这个问题:PyQt Connect to KeyPressEvent
我还查看了所有关于SourceForge的文档。任何帮助都将不胜感激!
发布于 2016-07-22 05:46:24
您可以使用两种方法,一种是简单地重新实现keyPressevent,不需要任何花哨的工作。像这样
from PyQt4 import QtCore, QtGui
import sys
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.setGeometry(300, 300, 250, 150)
self.show()
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Q:
print "Killing"
self.deleteLater()
elif event.key() == QtCore.Qt.Key_Enter:
self.proceed()
event.accept()
def proceed(self):
print "Call Enter Key"
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
或者,当您尝试使用信号时,在您的情况下,您缺少正确实现此信号的能力,这里是更新版本。
class Example(QtGui.QWidget):
keyPressed = QtCore.pyqtSignal(QtCore.QEvent)
def __init__(self):
super(Example, self).__init__()
self.setGeometry(300, 300, 250, 150)
self.show()
self.keyPressed.connect(self.on_key)
def keyPressEvent(self, event):
super(Example, self).keyPressEvent(event)
self.keyPressed.emit(event)
def on_key(self, event):
if event.key() == QtCore.Qt.Key_Enter and self.ui.continueButton.isEnabled():
self.proceed() # this is called whenever the continue button is pressed
elif event.key() == QtCore.Qt.Key_Q:
print "Killing"
self.deleteLater() # a test I implemented to see if pressing 'Q' would close the window
def proceed(self):
print "Call Enter Key"
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
发布于 2019-11-25 08:30:12
如果你在2019年看到这一点,如果Achayan的方法对你不起作用,那么检查几件事:
1)在主窗口或主小部件的子级中是否覆盖了keyPressEvent?子函数将覆盖父函数上的方法(至少在使用带有setCentralWidget的QMainWindow时)。如果是这种情况,那么信号可能不会像您预期的那样发出
2)您是否有处理按键输入方式与QWidget不同的小部件?例如,如果焦点在QTextEdit对象中,则不会向keyPressEvent发送键输入。将焦点转移到另一个widget
例如,观察以下内容的输出:
class myDialog(QtWidgets.QDialog):
keyPressed = QtCore.pyqtSignal(QtCore.QEvent)
def __init__(self, parent=None):
super(myDialog, self).__init__(parent)
self.keyPressed.connect(self.on_key)
leftGroupBox = QtWidgets.QGroupBox('A Group Label')
text = QtWidgets.QTextEdit('Enter some text')
layout = QtWidgets.QVBoxLayout()
layout.addWidget(text)
leftGroupBox.setLayout(layout)
rightGroupBox = QtWidgets.QGroupBox('Label Options')
label1 = QtWidgets.QCheckBox('ahu')
layout = QtWidgets.QVBoxLayout()
layout.addWidget(label1)
rightGroupBox.setLayout(layout)
# Create the main layout
mainLayout = QtWidgets.QGridLayout()
mainLayout.addWidget(leftGroupBox)
mainLayout.addWidget(rightGroupBox)
self.setLayout(mainLayout)
def keyPressEvent(self, event):
# keyPressEvent defined in child
print('pressed from myDialog: ', event.key())
# self.keyPressed.emit(event) # Emit is hidden in child
def on_key(self, event):
print('event received @ myDialog')
if event.key() == QtCore.Qt.Key_0:
print(0)
class MainWindow(QtWidgets.QMainWindow):
keyPressed = QtCore.pyqtSignal(QtCore.QEvent)
def __init__(self):
super(MainWindow, self).__init__()
self.keyPressed.connect(self.on_key)
self.setCentralWidget(myDialog())
self.show()
def keyPressEvent(self, event):
super(MainWindow, self).keyPressEvent(event)
print('pressed from MainWindow: ', event.key())
self.keyPressed.emit(event)
def on_key(self, event):
print('event received @ MainWindow')
if event.key() == QtCore.Qt.Key_0:
print(0)
if __name__ == '__main__':
ex = MainWindow()
Output @ console : (no event is received @myDialog OR MainWindow)
pressed from myDialog: 48
发布于 2017-03-17 17:53:08
对于Achayan的回答,我成功地使用了代码。可能是enter键和return键。试试Key_Enter和Key_Return。它们在我的键盘上是不同的。
https://stackoverflow.com/questions/38507011
复制相似问题