PySide6 表格控件实现表项往上拖动滚动右侧滚动条
PySide6 实现表格控件表项往上拖动滚动右侧滚动条
本文将介绍使用 PySide6 实现表格控件中表项往上拖动并滚动右侧滚动条的功能,同时支持表项选中和往下拖动。
代码示例
from PySide6.QtCore import Qt
from PySide6.QtGui import QDrag, QMouseEvent
from PySide6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem
class MyTableWidget(QTableWidget):
def __init__(self, rows, columns):
super().__init__(rows, columns)
self.setDragEnabled(True)
self.setAcceptDrops(True)
self.setDragDropMode(QTableWidget.InternalMove)
self.setSelectionMode(QTableWidget.SingleSelection)
self.setDragDropOverwriteMode(False)
self.viewport().setAcceptDrops(True)
self.viewport().setMouseTracking(True)
self.viewport().installEventFilter(self)
def eventFilter(self, obj, event):
if obj == self.viewport() and event.type() == QMouseEvent.MouseMove:
if event.buttons() == Qt.LeftButton:
item = self.itemAt(event.pos())
if item is not None:
drag = QDrag(self)
mimeData = self.mimeData([item])
drag.setMimeData(mimeData)
drag.exec_()
return super().eventFilter(obj, event)
def dropEvent(self, event):
if event.source() == self:
super().dropEvent(event)
else:
rows = []
for index in self.selectedIndexes():
rows.append(index.row())
rows.sort(reverse=True)
for row in rows:
self.removeRow(row)
event.setDropAction(Qt.MoveAction)
event.accept()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.tableWidget = MyTableWidget(10, 5)
self.setCentralWidget(self.tableWidget)
if __name__ == '__main__':
app = QApplication([])
mainWindow = MainWindow()
mainWindow.show()
app.exec()
代码解析
-
自定义
MyTableWidget类- 继承自
QTableWidget,并重写eventFilter()和dropEvent()方法。 - 设置拖放功能:
setDragEnabled(True)、setAcceptDrops(True)、setDragDropMode(QTableWidget.InternalMove) - 设置选中模式:
setSelectionMode(QTableWidget.SingleSelection) - 设置拖放覆盖模式:
setDragDropOverwriteMode(False) - 设置
viewport接受拖放事件并开启鼠标跟踪:viewport().setAcceptDrops(True)、viewport().setMouseTracking(True) - 安装事件过滤器:
viewport().installEventFilter(self)
- 继承自
-
eventFilter()方法- 监听鼠标移动事件,判断鼠标左键是否按下,以及当前位置是否有表项。
- 如果满足条件,则创建一个
QDrag对象,设置MimeData,并调用exec_()方法开始拖动操作。
-
dropEvent()方法- 判断拖放事件的来源:
- 如果来源是
MyTableWidget本身,则调用父类的dropEvent()方法进行处理。 - 否则,获取当前选中的表项,按照逆序方式删除对应的行,设置拖放操作类型并接受事件。
- 如果来源是
- 判断拖放事件的来源:
-
MainWindow类- 创建
MyTableWidget对象,并将其设置为主窗口的中央部件。
- 创建
使用说明
- 运行代码,会弹出一个表格窗口。
- 鼠标选中表格中的任意一行,然后按住鼠标左键并往上拖动。
- 拖动过程中,右侧滚动条会自动滚动,保证拖动到的行始终可见。
- 松开鼠标,选中的行会移动到目标位置。
总结
本示例代码通过自定义QTableWidget类,并重写eventFilter()和dropEvent()方法,实现了表格控件中表项往上拖动并滚动右侧滚动条的功能。同时,该代码也支持表项选中和往下拖动功能。
原文地址: https://www.cveoy.top/t/topic/qqry 著作权归作者所有。请勿转载和采集!