首页 > 解决方案 > 改变 QTableView 的滚动方向

问题描述

我一直在环顾四周,似乎找不到任何可以帮助我更改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)

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

QApplication::postEvent: Unexpected null receiver

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

标签: pythonpython-2.7pyqtpyqt4qtableview

解决方案


如果您希望当焦点在viewport()压力QTableViewshitf + scroll时水平滚动条移动,一个可能的解决方案是覆盖该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_())

推荐阅读