tablewidget怎么实现表项往上拖动能滚动右侧滚动条不能设置QAbstractItemViewNoSelection需要能够选中表项并拖动表项往下拖给下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()
在这个示例代码中,我们自定义了一个继承自QTableWidget的MyTableWidget类,并重写了其中的eventFilter()和dropEvent()方法。
在eventFilter()方法中,我们通过判断鼠标左键是否按下,并且当前位置是否有表项,来实现表项往上拖动的功能。如果满足条件,则创建一个QDrag对象,并设置相应的MimeData,然后调用exec_()方法开始拖动操作。
在dropEvent()方法中,我们判断拖放事件的来源,如果来源是MyTableWidget本身,则调用父类的dropEvent()方法进行处理。否则,我们获取当前选中的表项,并按照逆序的方式删除对应的行,然后设置拖放操作的类型并接受事件。
最后,在MainWindow类的构造函数中,我们创建了一个MyTableWidget对象,并将其设置为主窗口的中央部件
原文地址: https://www.cveoy.top/t/topic/iKbo 著作权归作者所有。请勿转载和采集!