QTabWidget中QListWidget上的QScroller是n

2024-10-06 11:21:21 发布

您现在位置:Python中文网/ 问答频道 /正文

简而言之,我有一个包含tab1和tab2的QTabWidget。tab1和tab2中的每一个都包含一个QListWidget。我想在每个QListWidget上使用QScroller。你知道吗

下面是代码(最简单的版本):

import sys

from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QAbstractItemView, QScrollerProperties, QScroller, QVBoxLayout, QListWidget,
                             QTabWidget, QApplication, QLabel, QListWidgetItem)
from PyQt5.QtCore import Qt


class MainWindow(QWidget):

    def __init__(self):
        super().__init__()

        self.resize(700, 300)

        mainLayout = QVBoxLayout()
        self.tabWidget = QTabWidget()
        self.tabWidget.setStyleSheet("QTabBar::tab { height: 50px; width: 250px; }")

        mainLayout.addWidget(self.tabWidget)

        myBoxLayout = QHBoxLayout()
        self.tabWidget.setLayout(myBoxLayout)

        self.tab1 = WidgetTab1()
        self.tab2 = WidgetTab2()

        self.tabWidget.addTab(self.tab1, 'Tab1')
        self.tabWidget.addTab(self.tab2, 'Tab2')
        self.setLayout(mainLayout)

class WidgetTab1(QWidget):

    def __init__(self):
        super().__init__()
        self.hbox = QHBoxLayout()

        # Create the list
        self.mylist = QListWidget()
        self.mylist.setStyleSheet("QListWidget::item { border-bottom: 1px solid gray; }")
        self.mylist.setFocusPolicy(Qt.NoFocus)
        self.mylist.setSelectionMode(QAbstractItemView.NoSelection)
        self.mylist.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.mylist.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)

        for i in range(20):
            item = QListWidgetItem(self.mylist)
            self.mylist.addItem(item)
            self.mylist.setItemWidget(item, QLabel(str(i)))

        self.sp = QScrollerProperties()
        self.sp.setScrollMetric(QScrollerProperties.DragVelocitySmoothingFactor, 0.6)
        self.sp.setScrollMetric(QScrollerProperties.MinimumVelocity, 0.0)
        self.sp.setScrollMetric(QScrollerProperties.MaximumVelocity, 0.2)
        self.sp.setScrollMetric(QScrollerProperties.AcceleratingFlickMaximumTime, 0.1)
        self.sp.setScrollMetric(QScrollerProperties.AcceleratingFlickSpeedupFactor, 1.2)
        self.sp.setScrollMetric(QScrollerProperties.SnapPositionRatio, 0.2)
        self.sp.setScrollMetric(QScrollerProperties.MaximumClickThroughVelocity, 1)
        self.sp.setScrollMetric(QScrollerProperties.DragStartDistance, 0.001)
        self.sp.setScrollMetric(QScrollerProperties.MousePressEventDelay, 0.5)

        self.scroller = QScroller.scroller(self.mylist.viewport())
        self.scroller.setScrollerProperties(self.sp)
        self.scroller.grabGesture(self.mylist.viewport(), QScroller.LeftMouseButtonGesture)

        self.mylist.show()
        self.hbox.addWidget(self.mylist)
        self.setLayout(self.hbox)

class WidgetTab2(QWidget):

    def __init__(self):
        super().__init__()
        self.hbox = QHBoxLayout()

        # Create the list
        self.mylist = QListWidget()
        self.mylist.setStyleSheet("QListWidget::item { border-bottom: 1px solid gray; }")
        self.mylist.setFocusPolicy(Qt.NoFocus)
        self.mylist.setSelectionMode(QAbstractItemView.NoSelection)
        self.mylist.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.mylist.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)

        for i in range(19, 0, -1):
            item = QListWidgetItem(self.mylist)
            self.mylist.addItem(item)
            self.mylist.setItemWidget(item, QLabel(str(i)))

        self.sp = QScrollerProperties()
        self.sp.setScrollMetric(QScrollerProperties.DragVelocitySmoothingFactor, 0.6)
        self.sp.setScrollMetric(QScrollerProperties.MinimumVelocity, 0.0)
        self.sp.setScrollMetric(QScrollerProperties.MaximumVelocity, 0.2)
        self.sp.setScrollMetric(QScrollerProperties.AcceleratingFlickMaximumTime, 0.1)
        self.sp.setScrollMetric(QScrollerProperties.AcceleratingFlickSpeedupFactor, 1.2)
        self.sp.setScrollMetric(QScrollerProperties.SnapPositionRatio, 0.2)
        self.sp.setScrollMetric(QScrollerProperties.MaximumClickThroughVelocity, 1)
        self.sp.setScrollMetric(QScrollerProperties.DragStartDistance, 0.001)
        self.sp.setScrollMetric(QScrollerProperties.MousePressEventDelay, 0.5)

        self.scroller = QScroller.scroller(self.mylist.viewport())
        self.scroller.setScrollerProperties(self.sp)
        self.scroller.grabGesture(self.mylist.viewport(), QScroller.LeftMouseButtonGesture)

        self.mylist.show()
        self.hbox.addWidget(self.mylist)
        self.setLayout(self.hbox)

if __name__ == '__main__':
    qApplication = QApplication(sys.argv)

    window = MainWindow()
    window.show()
    qApplication.exec_()

问题是,QScroller只在第一个选项卡中工作。例如,如果我首先选择tab1并在其上滚动。然后我切换到tab2,tab2上的滚动将不起作用。如果我先选择tab2并滚动它。然后我切换到tab1,tab1上的滚动将不起作用。你知道吗

我也尝试过每次切换标签时都取消操作,但都不起作用。你知道吗

我是否以错误的方式实现了QScroller?你知道吗

Behaviour Description


Tags: selfinititemsptab1mylistscrollerqlistwidget