首先——感谢你们的支持!一个月前我开始研究PyQt。在那段时间里,我遇到了很多问题,事实上总能在这里找到答案。在
直到现在。在
我有一个解决办法,但我认为这是一个愚蠢的,可能有一个适当的方法。我想更好地了解发生了什么事。在
代码如下:
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class FormWidget(QWidget):
def __init__(self, parent):
super(FormWidget, self).__init__(parent)
# Create view with image in it
self.image = QGraphicsPixmapItem(QPixmap())
self.scene = QGraphicsScene()
self.scene.addItem(self.image)
self.view = QGraphicsView(self.scene)
self.hlayout = QHBoxLayout()
self.hlayout.addWidget(self.view)
self.setLayout(self.hlayout)
# self.view.keyPressEvent = self.keyPressEvent
def keyPressEvent(self, event):
key = event.key()
mod = int(event.modifiers())
print(
"<{}> Key 0x{:x}/{}/ {} {} {}".format(
self,
key,
event.text(),
" [+shift]" if event.modifiers() & Qt.SHIFT else "",
" [+ctrl]" if event.modifiers() & Qt.CTRL else "",
" [+alt]" if event.modifiers() & Qt.ALT else ""
)
)
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
form = FormWidget(self)
self.setCentralWidget(form)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
mainWindow = MainWindow()
mainWindow.show()
sys.exit(app.exec_())
同样,所有键盘输入都由重载的keypresEvent()函数检测,箭头键除外。我已经找到了足够多的帖子来讨论这一点,我觉得这是因为子控件(自我观察)正在接收它们。我假设子窗口小部件实际上接收所有的击键操作,但忽略正在通过的按键,并吸收箭头键,这就是为什么它们不能访问父控件的keyPressEvent()函数的原因。似乎是这样,因为如果我取消了中间那行的注释:
^{pr2}$它的行为与我预期的一样——父级的keypresEvent()获取所有的击键,包括箭头。在
我如何告诉子部件忽略所有的击键?我想也许是这样:
self.view.setFocusPolicy(Qt.NoFocus)
当我添加它时,keypresevent()根本看不到任何键击。在
我想我也可以为子对象重载keypresEvent(),只需显式地将所有内容传递给父对象。但这似乎比不上我的克鲁格。在
我想我一定是误会了什么。在
谢谢。只是想学。。。在
默认情况下,
QWidget
不接受键盘焦点,因此需要显式启用它:您应该考虑使用
eventFilter
来捕获子控件上的事件,而不是子类化子小部件或试图阻止击键到达它。您将看到子窗口小部件之前的所有事件,并且可以抑制或转换它们。在http://doc.qt.io/qt-5.5/qobject.html#eventFilter
相关问题 更多 >
编程相关推荐