在Qt程序中,帮我写一个自定义QScrollArea,QScrollArea里是10个Label,可以实现鼠标拖动,拖动到底后拼接最开始的地方,实现可以无限拖动
时间: 2024-03-27 11:40:49 浏览: 72
好的,下面是一个示例代码,实现了你的要求:
```python
from PyQt5.QtWidgets import QApplication, QMainWindow, QScrollArea, QWidget, QLabel
from PyQt5.QtCore import QPoint, Qt
class CustomScrollArea(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# 创建10个Label
self.labels = []
for i in range(10):
label = QLabel(f"Label {i+1}", self)
label.move(0, i * 30)
self.labels.append(label)
# 记录鼠标按下时的坐标
self.mouse_press_pos = QPoint()
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.mouse_press_pos = event.pos()
def mouseMoveEvent(self, event):
if event.buttons() == Qt.LeftButton:
delta = event.pos() - self.mouse_press_pos
for label in self.labels:
label.move(label.pos() + delta)
self.mouse_press_pos = event.pos()
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
last_label = self.labels[-1]
first_label = self.labels[0]
if last_label.pos().y() + last_label.height() <= self.height():
last_label.move(0, first_label.pos().y() - last_label.height())
self.labels.pop()
self.labels.insert(0, last_label)
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
# 创建一个QScrollArea,并设置其viewport为自定义的QWidget
scroll_area = QScrollArea()
scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
scroll_area.setWidgetResizable(True)
custom_widget = CustomScrollArea()
scroll_area.setWidget(custom_widget)
# 设置主窗口的中央控件为QScrollArea
self.setCentralWidget(scroll_area)
self.setGeometry(100, 100, 300, 300)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
首先,我们创建了一个自定义的 QWidget,并在其中添加了 10 个 QLabel。接着,我们重写了这个自定义 QWidget 的 mousePressEvent、mouseMoveEvent 和 mouseReleaseEvent 事件,实现了鼠标拖动和拼接的功能。最后,我们创建了一个 QScrollArea,将其 viewport 设置为我们自定义的 QWidget,然后将 QScrollArea 设置为主窗口的中央控件。这样,我们就实现了一个自定义的 QScrollArea,其中包含 10 个可以拖动的 Label,并且可以无限拖动。
阅读全文