最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyQt通過動畫實現(xiàn)平滑滾動的QScrollArea

 更新時間:2023年01月28日 10:12:22   作者:之一Yo  
這篇文章主要為大家詳細介紹了PyQt如何使用Qt的動畫框架 QPropertyAnimation來實現(xiàn)平滑滾動的QScrollArea,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的可以學習一下

前言

在之前的博客《如何在 pyqt 中實現(xiàn)平滑滾動的 QScrollArea》中,我們使用定時器和隊列實現(xiàn)了平滑滾動。但是實現(xiàn)代碼還是有一點復雜,所以這篇博客將使用 Qt 的動畫框架 QPropertyAnimation 來實現(xiàn)相同的功能。

實現(xiàn)過程

SmoothScrollBar

滾動過程其實就是改變 QScrollBar 的 value() 的過程,Qt 自帶的 QScrollArea 之所以無法平滑滾動,就是因為滾動時在 QScrollBar 的兩個 value() 之間進行跳變。如果我們能在兩個滾動值之間進行插值,就能實現(xiàn)平滑滾動了,這里通過重寫 setValue() 函數(shù)來啟動滾動動畫。

   """ Smooth scroll bar """

    scrollFinished = pyqtSignal()

    def __init__(self, parent=None):
        QScrollBar.__init__(self, parent)
        self.ani = QPropertyAnimation()
        self.ani.setTargetObject(self)
        self.ani.setPropertyName(b"value")
        self.ani.setEasingCurve(QEasingCurve.OutCubic)
        self.ani.setDuration(500)
        self.ani.finished.connect(self.scrollFinished)

    def setValue(self, value: int):
        if value == self.value():
            return

        # stop running animation
        self.ani.stop()
        self.scrollFinished.emit()

        self.ani.setStartValue(self.value())
        self.ani.setEndValue(value)
        self.ani.start()

    def scrollValue(self, value: int):
        """ scroll the specified distance """
        value += self.value()
        self.scrollTo(value)

    def scrollTo(self, value: int):
        """ scroll to the specified position """
        value = min(self.maximum(), max(self.minimum(), value))
        self.setValue(value)

    def mousePressEvent(self, e):
        self.ani.stop()
        super().mousePressEvent(e)

    def mouseReleaseEvent(self, e):
        self.ani.stop()
        super().mouseReleaseEvent(e)

    def mouseMoveEvent(self, e):
        self.ani.stop()
        super().mouseMoveEvent(e)

SmoothScrollArea

最后需要將 QScrollArea 的默認滾動條替換為平滑滾動的 SmoothScrollBar

class SmoothScrollArea(QScrollArea):
    """ Smooth scroll area """

    def __init__(self, parent=None):
        super().__init__(parent)
        self.hScrollBar = SmoothScrollBar()
        self.vScrollBar = SmoothScrollBar()
        self.hScrollBar.setOrientation(Qt.Horizontal)
        self.vScrollBar.setOrientation(Qt.Vertical)
        self.setVerticalScrollBar(self.vScrollBar)
        self.setHorizontalScrollBar(self.hScrollBar)

    def setScrollAnimation(self, orient, duration, easing=QEasingCurve.OutCubic):
        """ set scroll animation

        Parameters
        ----------
        orient: Orient
            scroll orientation

        duration: int
            scroll duration

        easing: QEasingCurve
            animation type
        """
        bar = self.hScrollBar if orient == Qt.Horizontal else self.vScrollBar
        bar.ani.setDuration(duration)
        bar.ani.setEasingCurve(easing)

    def wheelEvent(self, e):
        if e.modifiers() == Qt.NoModifier:
            self.vScrollBar.scrollValue(-e.angleDelta().y())
        else:
            self.hScrollBar.scrollValue(-e.angleDelta().x())

測試

下面是一個簡單的圖片查看器測試程序:

import sys
from PyQt5.QtCore import QEasingCurve, Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QLabel


class Demo(SmoothScrollArea):

    def __init__(self):
        super().__init__()
        self.label = QLabel(self)
        self.label.setPixmap(QPixmap("shoko.jpg"))

        # customize scroll animation
        self.setScrollAnimation(Qt.Vertical, 400, QEasingCurve.OutQuint)
        self.setScrollAnimation(Qt.Horizontal, 400, QEasingCurve.OutQuint)

        self.horizontalScrollBar().setValue(1900)
        self.setWidget(self.label)
        self.resize(1200, 800)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = Demo()
    w.show()
    app.exec_()

最后

至此平滑滾動的實現(xiàn)方式就已介紹完畢了,更多自定義小部件可以參見 PyQt-Fluent-Widgets

到此這篇關于PyQt通過動畫實現(xiàn)平滑滾動的QScrollArea的文章就介紹到這了,更多相關PyQt QScrollArea內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python圖形化界面基礎篇之如何使用彈出窗口和對話框

    Python圖形化界面基礎篇之如何使用彈出窗口和對話框

    對于Python程序員來說,處理彈出窗口似乎并不是一個常見的任務,這篇文章主要給大家介紹了關于Python圖形化界面基礎篇之如何使用彈出窗口和對話框的相關資料,需要的朋友可以參考下
    2024-03-03
  • Python with語句用法原理詳解

    Python with語句用法原理詳解

    這篇文章主要介紹了Python with語句用法原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • 詳解Python中math和decimal模塊的解析與實踐

    詳解Python中math和decimal模塊的解析與實踐

    在Python中,math?和?decimal?模塊是處理數(shù)學運算的重要工具,本文將深入探討這兩個模塊的基礎知識,并通過實際的代碼示例演示它們的用法,希望對大家有所幫助
    2024-02-02
  • Python函數(shù)實現(xiàn)學員管理系統(tǒng)

    Python函數(shù)實現(xiàn)學員管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Python函數(shù)實現(xiàn)學員管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • python?字符串模糊匹配Fuzzywuzzy的實現(xiàn)

    python?字符串模糊匹配Fuzzywuzzy的實現(xiàn)

    本文主要介紹了python?字符串模糊匹配Fuzzywuzzy的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • widows下安裝pycurl并利用pycurl請求https地址的方法

    widows下安裝pycurl并利用pycurl請求https地址的方法

    今天小編就為大家分享一篇widows下安裝pycurl并利用pycurl請求https地址的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 詳細解讀Python的web.py框架下的application.py模塊

    詳細解讀Python的web.py框架下的application.py模塊

    這篇文章主要介紹了Python的web.py框架下的application.py模塊,作者深入分析了web.py的源碼,需要的朋友可以參考下
    2015-05-05
  • Django JSONField的自動轉換思路詳解(django自定義模型字段)

    Django JSONField的自動轉換思路詳解(django自定義模型字段)

    如果想實現(xiàn)JSONField的自動轉換,可以使用Django REST framework的JSONField,或者自定義一個字段類并覆蓋from_db_value()和get_prep_value()方法來實現(xiàn)這個功能,這篇文章主要介紹了Django JSONField的自動轉換(django自定義模型字段)問題,需要的朋友可以參考下
    2023-06-06
  • Python計算程序運行時間的方法

    Python計算程序運行時間的方法

    這篇文章主要介紹了Python計算程序運行時間的方法,分別記錄起始時間與結束時間,計算兩者之間的差值來獲得程序的運行時間,需要的朋友可以參考下
    2014-12-12
  • Django通過json格式收集主機信息

    Django通過json格式收集主機信息

    這篇文章主要介紹了基于Django收集主機信息json格式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05

最新評論

德阳市| 长岭县| 郁南县| 洛隆县| 鹤岗市| 连江县| 成都市| 永靖县| 锡林郭勒盟| 泌阳县| 丹巴县| 崇义县| 鄂尔多斯市| 乐平市| 抚顺县| 康平县| 安多县| 临沭县| 石柱| 古交市| 水富县| 慈利县| 襄垣县| 八宿县| 吉林省| 平乐县| 巩留县| 新兴县| 秦安县| 达州市| 闽清县| 景德镇市| 酉阳| 图们市| 岳西县| 剑川县| 天津市| 武强县| 开鲁县| 探索| 扎赉特旗|