在QTableWidget中拖动一行时,如何找出拖动FROM和TO的行索引?

时间:2009-11-21 20:42:20

标签: c++ qt qt4

我正在尝试将一些数组数据与QTableWidget的内容保持同步。我想启用拖放重新排序(在表格中移动项目,而不是复制),但是我不清楚当drop事件被触发时,我可以找出项目被拖动的索引。因此,我无法知道在同步的列表中要移动的对象。如何获取被拖动项目的原始行索引?

3 个答案:

答案 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]);
    }
  }
}

我倾向于使用模型/视图类,所以这可能有点偏,但它应该有效。