QTableView拦截Key_Down和Key_Up事件

时间:2014-08-03 13:44:27

标签: 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" intercepts"一些事件。按下普通字母时,不会发出任何事件""或者,例如。

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

编辑:

我使用的视图基本上是一个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,它没有做我想要的。我也是视图委托的子类,但通常(通常),没有任何东西可以干涉。

以下是我使用视图的方式:我加载模型,代理,然后使用我的视图:

    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会忽略上下键?

2 个答案:

答案 0 :(得分:1)

好的,我最终还是这样做了:

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对事件进行的常规处理,并且我将事件传播到父窗口小部件,因此我可以再次使用它。 / p>

我尝试做你在编辑中展示的内容,但它根本不适用于我,我不知道为什么。我的程序也非常大(~10k行),所以原因可能来自任何地方。但是感谢让我意识到错误的来源。

答案 1 :(得分:0)

对于实施的外部课程, 您必须在外侧覆盖此keyPressEvent方法。 像这个例子:

import sys
from PyQt4 import QtCore, QtGui

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

class exampleQMainWindow (QtGui.QMainWindow):
    def __init__ (self):
        super(exampleQMainWindow, self).__init__()
        testQTableWidget = ViewPerso(self)
        self.setCentralWidget(testQTableWidget)
        testQTableWidget.keyPressEvent = self.keyPressEvent

    def keyPressEvent (self, eventQKeyEvent):
        key = eventQKeyEvent.key()
        if key == QtCore.Qt.Key_F1:
            print 'Help'
        elif key == QtCore.Qt.Key_F5:
            print 'Reload'
        elif key == QtCore.Qt.Key_Left:
            print 'Left'
        elif key == QtCore.Qt.Key_Up:
            print 'Up'
        elif key == QtCore.Qt.Key_Right:
            print 'Right'
        elif key == QtCore.Qt.Key_Down:
            print 'Down'

app = QtGui.QApplication([])
window = exampleQMainWindow()
window.show()
sys.exit(app.exec_())