【问题标题】:Change QTableView's scroll orientation改变 QTableView 的滚动方向
【发布时间】:2018-12-16 16:40:42
【问题描述】:

我一直在环顾四周,似乎找不到任何可以帮助我在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 实现水平滚动?

【问题讨论】:

    标签: python python-2.7 pyqt pyqt4 qtableview


    【解决方案1】:

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

    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_())
    

    【讨论】:

    • 如果表格内的小部件被禁用了怎么办?
    • @JuanCarlosAsuncion 你可以更好地解释自己,并提供一个minimal reproducible example,就像我展示的那样,什么小部件?
    • 是的,对不起,我要举个例子,因为发布我的代码对于一个例子来说太大了
    • @JuanCarlosAsuncion 好的,我等你发一个像样的minimal reproducible example,我说的是你延迟的另一个问题,我不知道多久。 :)
    • 我现在将其标记为已回答,因为我真的认为这需要另一个问题,因为该事件会忽略禁用的小部件。感谢您的支持,我会尽力解决我的其他问题。这是真正困扰我的问题
    猜你喜欢
    • 1970-01-01
    • 2019-12-09
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 2016-12-06
    • 2021-06-23
    相关资源
    最近更新 更多