我正在尝试将一些数组数据与QTableWidget的内容保持同步。我想启用拖放重新排序(在表格中移动项目,而不是复制),但是我不清楚当drop事件被触发时,我可以找出项目被拖动的索引。因此,我无法知道在同步的列表中要移动的对象。如何获取被拖动项目的原始行索引?
答案 0 :(得分:3)
对QMimeData中的from索引进行编码,并使用setMimeData()将其存储在QDrag对象中。发生drop事件时,使用mimeData()从QDropEvent中提取数据。
答案 1 :(得分:1)
步骤1.覆盖QTableWidget :: mimeData函数。调用基类实现,然后将自己的自定义MIME类型填充到QMimeData中,并将其返回。
步骤2.重写QTableWidget :: dropEvent函数。如果您的MIME数据位于QMimeData中,请接受删除并提取数据。使用QTableWidget :: indexAt查找drop进入的行/列。
答案 2 :(得分:0)
QDropEvent
有一个source()
函数,可以为您提供启动拖放事件的小部件。然后在qobject_cast<QTableWidget>
上执行source
。验证指针后,请调用QTableWidget::findItems
以获取项目的行。
这样的事情:
void dropEvent ( QDropEvent * event ) {
if (event) {
QTableWidget* table = qobject_cast<QTableWidget*>(event->source());
if (table) {
QString item = ""// Decode MIME data here.
Qt::MatchFlag someFlag = Qt::MatchExactly; // Check documentation for match type.
QList<QTableWidgetItem *> items = table->findItems(item, someFlag)
// If you don't have repeats, items[0] is what you want.
int initialRow = table->row(items[0]);
}
}
}
我倾向于使用模型/视图类,所以这可能有点偏,但它应该有效。