改变 QTableView 的滚动方向

Change QTableView's scroll orientation

我环顾四周,似乎找不到任何示例可以帮助我在 QTableView 中更改滚轮的滚动方向。这是我最好的尝试。

这是我水平滚动所做的:

def eventFilter(self, obj, event):
    #some of my widgets are disabled, I can simply do another if for enabled ones

    if obj and obj.isEnabled() and event.type() == QEvent.Wheel and self.shift_key:
        newEvent = QWheelEvent(obj.mapToParent(event.pos()), event.globalPos(),
                               event.delta(), event.buttons(),
                               event.modifiers(), 1)
        QApplication.instance().postEvent(obj.parent(), newEvent)
        return True

    if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Shift:
        self.shift_key = True
        return True
    elif event.type() == QEvent.KeyRelease and event.key() == Qt.Key_Shift:
        self.shift_key = False
        return True

    return QObject.eventFilter(self, obj, event)

当我将鼠标悬停在 header 或空白 space 上时出现问题,因为它不会水平滚动并且还会显示一条错误消息

QApplication::postEvent: Unexpected null receiver

如何使用 scroll + shift 实现水平滚动?

如果您希望当焦点位于 QTableView 压力 shitf + scrollviewport() 时水平滚动条移动,一个可能的解决方案是覆盖 wheelEvent 方法, 制作过滤器并将事件发送到 horizontalScrollBar():

from PyQt4 import QtCore, QtGui

class TableView(QtGui.QTableView):
    def wheelEvent(self, event):
        if event.modifiers() == QtCore.Qt.ShiftModifier:
            QtGui.QApplication.sendEvent(self.horizontalScrollBar(), event)
        else:
            QtGui.QTableView.wheelEvent(self, event)

class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        lay = QtGui.QVBoxLayout(self)

        tableview = TableView()
        lay.addWidget(tableview)

        model = QtGui.QStandardItemModel(10, 10)
        tableview.setModel(model)

if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())