首页 > 解决方案 > 通过鼠标滚轮平滑滚动 QTableWidget

问题描述

我试过.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)哪个效果很好,但需要用户将鼠标移动到滚动条并使用它来体验平滑滚动,但鼠标滚轮的工作方式是跳跃滚动的旧方式,我想知道是否有办法让滚动在使用时表现相同鼠标滚轮?

标签: pythonpyqtpyqt5

解决方案


您应该使用 self.widget.verticalScrollBar().setSingleStep(step)。

QTableWidget继承了QTableView,继承了QAbstractItemView,继承了QAbstractScrollArea,继承了方法verticalScrollBar(),这就给我们带来了继承QAbstractSlider的QScrollBar类,最终有了setSingleStep(step)方法(可能还有更短的路径?)。

这是完整的代码:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class Window(QWidget):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)

        self.setWindowTitle("Scrolling QTableWidget smoothly BY MOUSE WHEEL")
        
        label = QLabel("singleStep:")
        self.spinbox = QSpinBox()
        self.spinbox.setValue(1)
        self.spinbox.setMinimum(1)
        self.spinbox.setMaximum(200)
        self.spinbox.valueChanged.connect(self.on_value_changed)

        self.widget = QTableWidget(100, 5)

        for i in range(100):
            for j in range(5):
                self.widget.setItem(i, j, QTableWidgetItem(str(i+j)))

        self.widget.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)
        #self.widget.verticalScrollBar().setSingleStep(1)
        self.set_single_step()

        spinbox_layout = QHBoxLayout()
        spinbox_layout.addStretch()
        spinbox_layout.addWidget(label)
        spinbox_layout.addWidget(self.spinbox)

        layout = QVBoxLayout()
        layout.addLayout(spinbox_layout)
        layout.addWidget(self.widget)
        self.setLayout(layout)

    def on_value_changed(self, step):
        self.set_single_step()

    def set_single_step(self):
        self.widget.verticalScrollBar().setSingleStep(self.spinbox.value())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.resize(800, 600)
    window.show()
    sys.exit(app.exec())

您可以增加/减少微调框中的步长以查看其行为方式。我希望这是你所要求的。


推荐阅读