QScrollArea内部的控件鼠标拖拽禁止QScroller滚动
时间: 2024-03-16 11:46:58 浏览: 25
您可以在QScrollArea的viewport上安装事件过滤器,以捕获所有的鼠标事件,并在拖拽开始时禁用QScroller的滚动,拖拽结束时恢复QScroller的滚动。
以下是一个示例代码:
```python
from PyQt5.QtCore import QObject, QPoint, Qt
from PyQt5.QtWidgets import QScrollArea, QWidget, QVBoxLayout
class ScrollArea(QScrollArea):
def __init__(self, parent=None):
super().__init__(parent)
# 创建一个QWidget作为viewport
self.viewport_widget = QWidget(self)
self.setWidget(self.viewport_widget)
# 创建一个垂直布局
self.layout = QVBoxLayout(self.viewport_widget)
# 添加一些控件
for i in range(10):
self.layout.addWidget(QWidget(self.viewport_widget))
# 安装事件过滤器
self.viewport().installEventFilter(self)
def eventFilter(self, obj, event):
if obj == self.viewport() and event.type() == Qt.MouseButtonPress:
# 鼠标按下时禁用QScroller的滚动
QScroller.grabGesture(self.viewport(), QScroller.LeftMouseButtonGesture)
elif obj == self.viewport() and event.type() == Qt.MouseButtonRelease:
# 鼠标释放时恢复QScroller的滚动
QScroller.ungrabGesture(self.viewport(), QScroller.LeftMouseButtonGesture)
return super().eventFilter(obj, event)
```
在这个示例中,我们创建了一个自定义的QScrollArea,并在其中添加了一些控件。然后我们在viewport上安装了事件过滤器,并在鼠标按下和鼠标释放事件中禁用和恢复了QScroller的滚动。