我试图实施"事情"在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会忽略上下键?
答案 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_())