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对象,并将其设置为主窗口的中央部件。

使用说明

  1. 运行代码,会弹出一个表格窗口。
  2. 鼠标选中表格中的任意一行,然后按住鼠标左键并往上拖动。
  3. 拖动过程中,右侧滚动条会自动滚动,保证拖动到的行始终可见。
  4. 松开鼠标,选中的行会移动到目标位置。

总结

本示例代码通过自定义QTableWidget类,并重写eventFilter()dropEvent()方法,实现了表格控件中表项往上拖动并滚动右侧滚动条的功能。同时,该代码也支持表项选中和往下拖动功能。

PySide6 表格控件实现表项往上拖动滚动右侧滚动条

原文地址: https://www.cveoy.top/t/topic/qqry 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录