QScrollArea中使用QScroller,阻止viewport内的控件鼠标左键拖动也触发滚动,而是只在除控件外的空白地方触发滚动
时间: 2024-03-16 15:45:32 浏览: 123
要实现这个功能,你可以在QScrollArea的viewport上安装一个事件过滤器来过滤鼠标事件,只有在空白地方的鼠标左键拖动事件才会触发滚动。
具体的实现步骤如下:
1. 在QScrollArea的构造函数中创建QScroller,并将其绑定到viewport上,如下所示:
```python
self.scroll_area = QScrollArea()
self.scroller = QScroller.scroller(self.scroll_area.viewport())
self.scroller.setScrollerProperties(QScrollerProperties().setScrollMetric(QScrollerProperties.DragVelocitySmoothingFactor, 0.6))
self.scroller.grabGesture(self.scroll_area.viewport(), QScroller.LeftMouseButtonGesture)
```
这里创建了一个QScroller,并将其绑定到scroll_area的viewport上,然后设置了一些滚动属性和手势。
2. 在QScrollArea的构造函数中安装一个事件过滤器,并重写过滤器的eventFilter方法,如下所示:
```python
self.scroll_area.viewport().installEventFilter(self)
```
```python
def eventFilter(self, obj, event):
if obj == self.scroll_area.viewport() and event.type() == QEvent.MouseMove and event.buttons() == Qt.LeftButton:
# 获取当前鼠标位置,判断是否在控件内
pos = event.pos()
for child in obj.children():
if child.geometry().contains(pos):
return False
# 如果不在控件内,则拦截鼠标左键拖动事件,阻止控件触发滚动
event.ignore()
return True
return False
```
这里安装了一个事件过滤器,并重写了其eventFilter方法。在eventFilter方法中,如果鼠标左键拖动事件发生在viewport内,并且不在控件内,则拦截该事件,阻止控件触发滚动,否则不做处理,返回False。
通过这样的实现,就可以在QScrollArea中使用QScroller,阻止viewport内的控件鼠标左键拖动也触发滚动,而是只在除控件外的空白地方触发滚动了。
阅读全文