QScrollArea里是10个QLabel,可以实现鼠标拖动,拖动到底后拼接最开始的地方,实现可以无限拖动,并且QScrollArea只能显示5个Qlabel,中间的Qlabel变为黄色
时间: 2024-03-27 09:40:52 浏览: 63
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
好的,这个问题可以分为以下几个部分实现:
1. 创建一个 QScrollArea,将其中的 widget 设置为一个 QVBoxLayout 布局,并添加 10 个 QLabel 到布局中。
2. 为每个 QLabel 添加鼠标按下、鼠标移动、鼠标释放事件的处理函数,实现拖动功能。
3. 当拖动到底部时,将最开始的 QLabel 添加到布局末尾。
4. 当 QScrollArea 中显示的 QLabel 发生改变时,将中间的 QLabel 设为黄色。
下面是一个简单的实现代码,你可以参考一下:
```python
from PyQt5.QtWidgets import QApplication, QScrollArea, QVBoxLayout, QLabel
from PyQt5.QtGui import QColor
from PyQt5.QtCore import Qt, QPoint
class DragLabel(QLabel):
def __init__(self, parent=None):
super().__init__(parent)
self.setMouseTracking(True)
self.dragging = False
self.offset = QPoint()
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.dragging = True
self.offset = event.pos()
def mouseMoveEvent(self, event):
if self.dragging:
self.move(self.mapToParent(event.pos() - self.offset))
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.dragging = False
class ScrollArea(QScrollArea):
def __init__(self, parent=None):
super().__init__(parent)
self.labels = []
for i in range(10):
label = DragLabel(f"Label {i}")
label.setAlignment(Qt.AlignCenter)
self.labels.append(label)
self.layout().addWidget(label)
self.setWidgetResizable(True)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setFixedHeight(150)
self.current_index = 2
self.labels[self.current_index].setStyleSheet("background-color: yellow")
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
for label in self.labels:
if label.underMouse():
self.current_index = self.labels.index(label)
self.labels[self.current_index].setStyleSheet("background-color: yellow")
break
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.labels[self.current_index].setStyleSheet("background-color: none")
def mouseMoveEvent(self, event):
if event.buttons() == Qt.LeftButton:
if self.current_index is not None:
self.labels[self.current_index].setStyleSheet("background-color: none")
self.current_index = None
def resizeEvent(self, event):
super().resizeEvent(event)
if len(self.labels) > 5:
pos = self.verticalScrollBar().value()
if pos % 30 == 0:
index = pos // 30
if index < 0:
index = 0
for i in range(len(self.labels)):
if i == index + 2:
self.labels[i].setStyleSheet("background-color: yellow")
else:
self.labels[i].setStyleSheet("background-color: none")
if pos >= self.verticalScrollBar().maximum():
self.labels[0].move(0, self.labels[-1].y() + 30)
self.layout().removeWidget(self.labels[0])
self.layout().addWidget(self.labels[0])
self.labels.append(self.labels.pop(0))
if __name__ == '__main__':
app = QApplication([])
scrollArea = ScrollArea()
scrollArea.show()
app.exec_()
```
在这个实现中,我们创建了一个 `DragLabel` 类来实现 QLabel 的拖动功能,创建了一个 `ScrollArea` 类来实现 QScrollArea 中的 QLabel 的添加、拖动、显示等功能。其中,拖动功能通过重写 `mousePressEvent`、`mouseMoveEvent` 和 `mouseReleaseEvent` 函数来实现;当 QScrollArea 中的 QLabel 发生变化时,我们会重新计算中间的 QLabel 的位置,并将其设为黄色。
需要注意的是,这个实现中的 `DragLabel` 类只是为了演示方便而创建的,如果你的 QLabel 内容比较复杂,可能需要继承自其他类来实现更复杂的功能。
阅读全文