Как применить QScrollerProperties к QScroller, чтобы избавиться от перерегулирования? - PullRequest
1 голос
/ 02 марта 2020

Как видно из заголовка, я пытаюсь создать область scrollArea, которая использует QScroller с grabgesture, поэтому я могу прокручивать, перетаскивая виджет. Я нашел несколько хороших примеров и заставил их работать. Теперь я хочу удалить выброс, который происходит, когда вы перетаскиваете дальше, чем есть элементы в виджете.
Но когда я пытаюсь настроить Qscroller, я не могу понять, как применить QScrollerProperties к QScroller. Вот как я предполагаю, что вы удалите выброс.
Вот пример кода:

import sys

from PyQt5.QtWidgets import (
    QApplication,
    QFormLayout,
    QGridLayout,
    QLabel,
    QScrollArea,
    QScroller,
    QScrollerProperties,
    QWidget,
)


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        scroll_area = QScrollArea()
        layout = QGridLayout(self)
        layout.addWidget(scroll_area)

        scroll_widget = QWidget()
        scroll_layout = QFormLayout(scroll_widget)

        for i in range(200):
            scroll_layout.addRow(QLabel('Label #{}'.format(i)))

        scroll_area.setWidget(scroll_widget)

        scroll = QScroller.scroller(scroll_area.viewport())
        scroll.grabGesture(scroll_area.viewport(), QScroller.LeftMouseButtonGesture)
        scroll.scrollerPropertiesChanged.connect(self.PropsChanged) #Just to see if I could registre a change

        props = scroll.scrollerProperties()
        props.setScrollMetric(QScrollerProperties.VerticalOvershootPolicy,QScrollerProperties.OvershootAlwaysOff)
        props.setScrollMetric(QScrollerProperties.DragStartDistance, 0.01)

        #Apply Qscroller properties here somehow?
        print(scroll.scrollerProperties().scrollMetric(QScrollerProperties.DragStartDistance))
        scroll.scrollerProperties = props #Maybe? Doesn't seem to change the overshoot?


    def PropsChanged(self):
        print("Something is being changed??")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

Я не уверен, как действовать дальше. Любая помощь будет оценена:)

1 Ответ

1 голос
/ 02 марта 2020

Просто позвоните scroll.setScrollerProperties(props), как только вы установите новые свойства.

При вызове scrollerProperties() вы получите «копию» текущих свойств: это не указатель к фактическим свойствам, поэтому ничего не изменится, если вы не примените их обратно к скроллеру.

Это почти как вызов self.font():

    font = self.font()
    font.setPointSize(20)
    # at this point, the widget font is still the same...
    # unless you do this:
    self.setFont(font)

То же самое относится почти к любому свойству, например text() / setText() для этикеток, palette() / setPalette() и т. Д. c.

Чтобы предотвратить вертикальный выброс, вы должны использовать setScrollMetric с VerticalOvershootPolicy и установить значение к OvershootВсегдаOff:

    props.setScrollMetric(QScrollerProperties.VerticalOvershootPolicy, 
        QScrollerProperties.OvershootAlwaysOff)
    scroll.setScrollerProperties(props)

...