C++ 在QTableWidget中拖动行时,如何找出它从哪个行索引拖动到哪个行索引?

C++ 在QTableWidget中拖动行时,如何找出它从哪个行索引拖动到哪个行索引?,c++,qt,qt4,C++,Qt,Qt4,我试图使一些数组数据与QTableWidget的内容保持同步。我想启用拖放重新排序(在表中移动项,而不是复制),但我不清楚在触发drop事件时,如何找到从哪个索引拖动项。因此,我无法知道要在与之同步的列表中移动哪个对象。如何获取被拖动项的原始行索引?在qimedata中对from索引进行编码,并使用setMimeData()将其存储在QDrag对象中。当拖放事件发生时,使用mimeData()从QDropEvent提取数据。有一个source()函数,该函数将为您提供启动拖放事件的小部件。然后在

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

在qimedata中对from索引进行编码,并使用setMimeData()将其存储在QDrag对象中。当拖放事件发生时,使用mimeData()从QDropEvent提取数据。

有一个
source()
函数,该函数将为您提供启动拖放事件的小部件。然后在
源代码上执行
qobject\u cast
。验证指针后,调用以获取该项的行

比如说:

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]);
    }
  }
}
void dropEvent(QDropEvent*事件){
如果(事件){
QTableWidget*table=qobject_cast(事件->源());
如果(表){
QString item=”“//在此处解码MIME数据。
Qt::MatchFlag someFlag=Qt::matchjustice;//检查文档中的匹配类型。
QList items=table->findItems(item,someFlag)
//如果没有重复项,则项目[0]是您想要的。
int initialRow=表格->行(项目[0]);
}
}
}

我倾向于使用模型/视图类,所以这可能有点不合适,但它应该可以工作。

步骤1。重写QTableWidget::mimeData函数。调用基类实现,然后将您自己的自定义MIME类型填充到QMimeData中,并返回它

第二步。重写QTableWidget::dropEvent函数。如果MIME数据在QMimeData中,请接受删除并提取数据。使用QTableWidget::indexAt查找放置的行/列