PyQt5实现任意区域用鼠标控制QScrollArea的横向滚动条

一般,使用QScrollArea在滚动区内滚动鼠标,只会触发纵向滚动条。横向滚动条的滚动需要将鼠标移动到横向滚动条上是才会触发。该代码片段通过覆写QScrollArea的滚轮事件,实现在滚动区内任意位置滚动横向滚动条。 

#!/usr/bin/env python
# coding=utf-8
# @Time    : 2021/9/22 16:06
# @Author  : [email protected]
# @Software: PyCharm

import sys
from PyQt5.Qt import *
from types import MethodType


def scroll_area_wheel_event(self, a0):
    """
    在ScrollArea任意区域滚动鼠标,实现横向滚动条滚动。

    鼠标滚轮事件,实现横向横向滚动条滚动。
    :param self: scrollArea对象
    :param a0: 滚动事件
    :return:
    """
    horizontal_bar = self.horizontalScrollBar()
    delta_x = - a0.angleDelta().y()  # 鼠标只能纵向滚动
    v = horizontal_bar.value() + delta_x
    v = max(min(v, horizontal_bar.maximum()), horizontal_bar.minimum())  # 限制横向滚动条的value值。
    horizontal_bar.setValue(v)  # 设置滚动值


class ScrollWidget(QWidget):
    def __init__(self, parent=None):
        super(ScrollWidget, self).__init__(parent=parent)
        self.scroll = QScrollArea()
        self.scroll.wheelEvent = MethodType(scroll_area_wheel_event, self.scroll)
        self.widget = QWidget()

        self.init_ui()
        self.init_style()

    def init_ui(self):
        layout = QHBoxLayout()
        self.scroll.setWidget(self.widget)
        layout.addWidget(self.scroll)
        self.setLayout(layout)
        self.setWindowTitle("ScrollArea实现横向滚动")

    def init_style(self):
        self.widget.setFixedSize(QSize(1000, 1000))
        self.setFixedSize(600, 600)


def main():
    app = QApplication(sys.argv)
    ex = ScrollWidget()
    ex.show()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

PyQt5实现任意区域用鼠标控制QScrollArea的横向滚动条_第1张图片

你可能感兴趣的:(Python,html)