PyQt控件键盘焦点

2024-06-08 22:27:06 发布

您现在位置:Python中文网/ 问答频道 /正文

首先——感谢你们的支持!一个月前我开始研究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(),只需显式地将所有内容传递给父对象。但这似乎比不上我的克鲁格。在

我想我一定是误会了什么。在

谢谢。只是想学。。。在


Tags: fromimageimportselfeventviewifinit
2条回答

默认情况下,QWidget不接受键盘焦点,因此需要显式启用它:

class FormWidget(QWidget):
    def __init__(self, parent):
        ... 
        self.setFocusPolicy(Qt.StrongFocus)

您应该考虑使用eventFilter来捕获子控件上的事件,而不是子类化子小部件或试图阻止击键到达它。您将看到子窗口小部件之前的所有事件,并且可以抑制或转换它们。在

http://doc.qt.io/qt-5.5/qobject.html#eventFilter

相关问题 更多 >