gpt4 book ai didi

QT:QTableView中行的内部拖放,改变QTableModel中行的顺序

转载 作者:行者123 更新时间:2023-12-03 20:15:44 25 4
gpt4 key购买 nike

我想在 QTableView 中执行一种行,以便底层 TableModel 也对其数据进行排序:
enter image description here

如果我没记错的话,QTableView 中的内置排序不会影响底层 TableModel 中的行顺序,所以我不得不编写自定义 QTableView 和自定义 QAbstractTableModel 内部拖放的实现。

为了测试它是否有效,我通过重新排序第一行和第二行来响应单元格的任何拖动:

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class Model(QAbstractTableModel):
def __init__(self):
QAbstractTableModel.__init__(self, parent=None)
self.data = [("elem1", "ACDC"), ("elem2", "GUNSNROSES"), ("elem3", "UFO")]
self.setSupportedDragActions(Qt.MoveAction)

def flags(self, index):
if index.isValid():
return Qt.ItemIsDragEnabled | Qt.ItemIsDropEnabled | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable
else:
return Qt.ItemIsDropEnabled | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable

def rowCount(self, parent=QModelIndex()):
return len(self.data)

def columnCount(self, parent=QModelIndex()):
return 1

def data(self, index, role):
if role == Qt.DisplayRole:
print "row = %s" % int(index.row())
return QVariant(self.data[int(index.row())][1])
return QVariant()

def headerData(self, index, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return QVariant(str(index))
elif orientation == Qt.Vertical and role == Qt.DisplayRole:
return self.data[index][0]

def dragMoveEvent(self, event):
event.setDropAction(QtCore.Qt.MoveAction)
event.accept()

def moveRows(self, parent, source_first, source_last, parent2, dest):
print "moveRows called, self.data = %s" % self.data
self.beginMoveRows(parent, source_first, source_last, parent2, dest)

self.data = self.data[1] + self.data[0] + self.data[2]
self.endMoveRows()
print "moveRows finished, self.data = %s" % self.data

class View(QTableView):
def __init__(self, parent=None):
QTableView.__init__(self, parent=None)
self.setSelectionMode(self.ExtendedSelection)
self.setDragEnabled(True)
self.acceptDrops()
self.setDragDropMode(self.InternalMove)
self.setDropIndicatorShown(True)

def dragEnterEvent(self, event):
event.accept()

def dragMoveEvent(self, event):
event.accept()

def dropEvent(self, event):
print "dropEvent called"
point = event.pos()
self.model().moveRows(QModelIndex(), 0, 0, QModelIndex(), 1)
event.accept()

def mousePressEvent(self, event):
print "mousePressEvent called"
self.startDrag(event)

def startDrag(self, event):
print "startDrag called"
index = self.indexAt(event.pos())
if not index.isValid():
return

self.moved_data = self.model().data[index.row()]

drag = QDrag(self)

mimeData = QMimeData()
mimeData.setData("application/blabla", "")
drag.setMimeData(mimeData)

pixmap = QPixmap()
pixmap = pixmap.grabWidget(self, self.visualRect(index))
drag.setPixmap(pixmap)

result = drag.start(Qt.MoveAction)

class Application(object):
def __init__(self):
app = QApplication(sys.argv)

self.window = QWidget()
self.window.show()

layout = QVBoxLayout(self.window)

self.view = View()
self.view.setModel(Model())

layout.addWidget(self.view)
sys.exit(app.exec_())

由于某种原因,此代码不起作用。它成功开始拖动(嗯,几乎成功,因为它显示上一行,而不是当前行作为拖动图标),调用 mousePressEvent , startDrag , dropEventmoveRows函数,但随后在 moveRows 内死亡带有消息:
Qt has caught an exception thrown from an event handler. Throwing
exceptions from an event handler is not supported in Qt. You must
reimplement QApplication::notify() and catch all exceptions there.

Qt has caught an exception thrown from an event handler. Throwing
exceptions from an event handler is not supported in Qt. You must
reimplement QApplication::notify() and catch all exceptions there.

terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted

(错误消息中的段落重复是故意的 - 这就是它逐字输出的内容)。

如何调试此错误? (在 try 中插入 except - moveRows 没有帮助)

您是否有更好的方法来执行内部拖放,从而影响表格 View 中的模型?

最佳答案

您的代码中有几个问题,我将在这里仅解决两个问题:

  • 您调用Model.moveRows使用错误的论点:
    更改 self.model().moveRows(QModelIndex(), 0, 0, QModelIndex(), 1)通过 self.model().moveRows(QModelIndex(), 1, 1, QModelIndex(), 0)
  • 您正在以错误的方式更改数据:
    更改 self.data = self.data[1] + self.data[0] + self.data[2]通过 self.data = [self.data[1], self.data[0] , self.data[2]]

  • 注意:问题 1 是在您的代码中引发异常的问题。另请注意,将实例变量和函数命名为相同( Model.data)是一个坏主意

    关于QT:QTableView中行的内部拖放,改变QTableModel中行的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21842342/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com