python - QTableView拦截Key_Down和Key_Up事件

标签 python pyqt qtableview

我正在尝试在 QTableView 上实现“事物”。因此,我开始重写它的 keyPressEvent 方法,正如它在各处所描述的那样:

if e.key() == QtCore.Qt.Key_F2 and self.tableau.hasFocus():
    blabla

elif e.key() == QtCore.Qt.Key_Return and self.tableau.hasFocus():
    blabla

#TEST
elif e.key() == QtCore.Qt.Key_Right:
    print("right")
elif e.key() == QtCore.Qt.Key_Down:
    print("down")
else:
    print("waza")

我可以处理 F2 和 Return 事件,它们可以工作。但不是 Key_Down 事件! Key_right 也有效,但 Down 无效。我认为这是因为 QTableWidget“拦截”了一些事件。例如,当按下普通字母时,也不会“发出”任何事件。

我想访问所有事件(或至少是 Up 和 Down 事件),我该怎么做?

编辑:

我使用的 View 基本上是一个 QTableView,我对其进行了一些修改:

class ViewPerso(QtGui.QTableView):

    def __init__(self, parent=None):
        super(ViewPerso, self).__init__(parent)

        self.parent = parent


    def currentChanged(self, current, previous):

        index = current.sibling(current.row(), 4)

        try:
            if not index.data() or len(self.parent.vidsSelected()) > 1:
                return
        except AttributeError:
            pass

        self.clicked.emit(current)
        self.scrollTo(current)


    def keyboardSearch(self, search):

        pass

我不使用 QTableWidget,它无法满足我的要求。我还对 View 委托(delegate)进行了子类化,但通常(通常)不会有任何干扰。

下面是我如何使用我的 View :我加载一个模型、一个代理,然后我使用我的 View :

    self.modele = ModelPerso()

    self.modele.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
    self.modele.setTable("videos")
    self.modele.select()

    self.proxy = QtGui.QSortFilterProxyModel()
    self.proxy.setSourceModel(self.modele)

    self.tableau = ViewPerso(self)
    self.tableau.setModel(self.proxy)
    self.tableau.setItemDelegate(ViewDelegate(self))

我不知道按键在哪里结束,现在,它们只是消失了。我认为(我认为),每个小部件都有一种处理按键事件的方法,也许 QTableView 会忽略上下键?

最佳答案

好吧,我终于这样做了:

class ViewPerso (QtGui.QTableView):
    def __init__(self, parent = None):
        super(ViewPerso, self).__init__(parent)
        self.parent = parent

    def currentChanged (self, current, previous):
        index = current.sibling(current.row(), 4)
        try:
            if not index.data() or len(self.parent.vidsSelected()) > 1:
                return
        except AttributeError:
            pass
        self.clicked.emit(current)
        self.scrollTo(current)

    def keyboardSearch (self, search):
        pass

    def keyPressEvent (self, e):
        super(ViewPerso, self).keyPressEvent(e)
        e.ignore()

事件可能卡在了 ViewPerso 中,所以通过像这样覆盖它的 keyPressEvent 方法,我得到了 QTableWidget 对事件所做的通常处理,并且我将事件传播到父窗口小部件,所以我可以再次使用它。

我尝试按照您在编辑中显示的内容进行操作,但它对我来说根本不起作用,我真的不知道为什么。我的程序也很大(~10k 行),所以原因可能来自任何地方。但感谢让我意识到错误的来源。

关于python - QTableView拦截Key_Down和Key_Up事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25105255/

相关文章:

python - 如何在 SQLITE3 上关闭和删除数据库后再次打开数据库

c++ - 在 Qt 中单击 QTableView 中某一行的特定单元格时打开一个新窗口

c++ - 将项目添加到 QStandardItemModel 中的列

python - Rabbitmq consumer_timeout 行为没有按预期工作?

python - 如何在这段代码上应用 PyQt QThread

Python POST 选中网页上的复选框

python - 如何将 QML Drawer 与 Qt Widgets 一起使用?

c++ - 如何为 QTableView 中的特定单元格着色或加粗文本?

基于 Python 的密码跟踪器(或字典)

python - 将流水线与 sklearn 一起使用