下面是一个使用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()

在这个示例代码中,我们自定义了一个继承自QTableWidget的MyTableWidget类,并重写了其中的eventFilter()和dropEvent()方法。

在eventFilter()方法中,我们通过判断鼠标左键是否按下,并且当前位置是否有表项,来实现表项往上拖动的功能。如果满足条件,则创建一个QDrag对象,并设置相应的MimeData,然后调用exec_()方法开始拖动操作。

在dropEvent()方法中,我们判断拖放事件的来源,如果来源是MyTableWidget本身,则调用父类的dropEvent()方法进行处理。否则,我们获取当前选中的表项,并按照逆序的方式删除对应的行,然后设置拖放操作的类型并接受事件。

最后,在MainWindow类的构造函数中,我们创建了一个MyTableWidget对象,并将其设置为主窗口的中央部件

tablewidget怎么实现表项往上拖动能滚动右侧滚动条不能设置QAbstractItemViewNoSelection需要能够选中表项并拖动表项往下拖给下pyside6的示例代码

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

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