我想知道我需要做什么才能配置QTableView,这样我就可以使用shift + click和ctrl + click来选择多行,然后将它们拖放到tableview中。
我现阶段的代码是:
class testWindow(QMainWindow):
def __init__(self):
super(testWindow,self).__init__()
self._ui = uic.loadUi('mainwindow.ui', self)
self.csvTableModel = TableModel()
self.csvDataTableView.setModel(self.csvTableModel)
self.csvDataTableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
self.csvDataTableView.verticalHeader().setSectionsMovable(True)
self.csvDataTableView.verticalHeader().setDragDropMode(QAbstractItemView.InternalMove)
self.csvDataTableView.verticalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
.ui文件中定义的.csvDataTableView对象显然是QTableView。
此代码允许我通过单击行标题来选择行,使用ctrl和shift来选择多行等。当它尝试拖放时,它会落下。
当我单击按钮时,QHeaderView似乎解释为我告诉它选择/取消选择鼠标当前所在的标题所代表的行。如果我在释放按钮之前移动鼠标,它仍然会愉快地允许我拖放该行,但除了移动它们(如果需要)以外,它对任何其他选定的行都不执行任何操作以为单行创建空间移动或占据该行先前占用的空间。
即。如果行标题的原始顺序是:
1
2
3
4
然后我点击1,然后按住Ctrl键点击3和4,然后将鼠标按钮向下按4并将其移动到1之前,试图移动整个选择,结果是:
4
1
2
3
我真正希望看到的,并且看到整个选择被移动而不仅仅是第4行:
1
3
4
2
我不知道是否有可能向qt表明我想要移动所有选定的行,而不仅仅是当我按下鼠标按钮时我正在悬停的行而不实际继承QHeaderView并重写其中的一些功能(虽然我希望如此)。
假设我确实需要继承QHeaderView,那么会重写startDrag以检查当时选择的行和dropEvent来移动所有选择行,而不仅仅是按下按钮时鼠标所在的行,是否足够?如果是这样,这会导致dropIndicator显示所有选定行标题的鬼轮廓,而我正在拖动或只是一个? 如果没有,我是否需要重新实现mousePressEvent和mouseMoveEvent as outlined in the qt docs还是有更简单的方法?