Lời nói đầu
Trong blog trước "Cách triển khai QScrollArea cuộn mượt mà trong pyqt", chúng tôi đã sử dụng bộ tính giờ và hàng đợi để đạt được khả năng cuộn mượt mà. Tuy nhiên, mã triển khai vẫn hơi phức tạp nên blog này sẽ sử dụng khung hoạt hình QPropertyAnimation của Qt để đạt được chức năng tương tự.
Quá trình thực hiện
Quá trình cuộn thực chất là quá trình thay đổi giá trị() của QScrollBar. Lý do khiến QScrollArea của Qt không thể cuộn trơn tru là vì nó nhảy giữa hai giá trị() của QScrollBar trong quá trình cuộn. Nếu có thể nội suy giữa hai giá trị cuộn, chúng ta có thể đạt được thao tác cuộn mượt mà. Ở đây, chúng ta bắt đầu hoạt ảnh cuộn bằng cách ghi đè hàm setValue().
lớp SmoothScrollBar(QScrollBar): """ Thanh cuộn mượt """ 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 # dừng hoạt ảnh đang chạy self.ani.stop() self.scrollFinished.emit() self.ani.setStartValue(self.value()) self.ani.setEndValue(value) self.ani.start() def scrollValue(self, value: int): """ cuộn theo khoảng cách đã chỉ định """ giá trị += self.value() self.scrollTo(giá trị) def scrollTo(self, value: int): """ cuộn đến vị trí đã chỉ định """ giá trị = min(self.maximum(), max(self.minimum(), value)) self.setValue(giá trị) 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)
Cuối cùng, bạn cần thay thế thanh cuộn mặc định của QScrollArea bằng SmoothScrollBar cuộn mượt mà:
lớp SmoothScrollArea(QScrollArea): """ Vùng cuộn mượt mà """ 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): """ đặt hoạt ảnh cuộn Tham số ---------- orient: Định hướng hướng cuộn thời lượng: int thời lượng cuộn easing: QEasingCurve kiểu hoạt ảnh """ bar = self.hScrollBar nếu 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())
Bài kiểm tra
Đây là một chương trình thử nghiệm trình xem hình ảnh đơn giản:
# mã hóa:utf-8 nhập sys từ PyQt5.QtCore nhập QEasingCurve, Qt từ PyQt5.QtGui nhập QPixmap từ PyQt5.QtWidgets nhập QApplication, QLabel lớp Demo(SmoothScrollArea): def __init__(self): super().__init__() self.label = QLabel(self) self.label.setPixmap(QPixmap("shoko.jpg")) # tùy chỉnh hoạt ảnh cuộn 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__': ứng dụng = QApplication(sys.argv) w = Demo() w.show() ứng dụng.exec_()
Những hình ảnh được sử dụng để thử nghiệm như sau (Nizi-chan thật dễ thương:
viết ở cuối
Tại thời điểm này, việc triển khai tính năng cuộn mượt mà đã được giới thiệu. Để biết thêm các tiện ích tùy chỉnh, vui lòng tham khảo PyQt-Fluent-Widgets ở trên~~.
Cuối cùng, bài viết này về cách sử dụng hoạt ảnh để triển khai QScrollArea cuộn mượt mà trong pyqt kết thúc tại đây. Nếu bạn muốn biết thêm về cách sử dụng hoạt ảnh để triển khai QScrollArea cuộn mượt mà trong pyqt, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục Duyệt các bài viết liên quan, tôi mong bạn sẽ ủng hộ blog của mình trong tương lai nhé! .
Tôi là một lập trình viên xuất sắc, rất giỏi!