可以通过以下步骤实现:
为视图tblTestNode添加拖拽功能,使其能够响应鼠标拖拽操作。可以使用QTableView的setDragEnabled和setAcceptDrops方法来实现。
实现列表项位置的变化。当用户在视图中进行了列表项的拖拽操作时,会触发QTableView的dragMoveEvent和dropEvent事件,在这些事件处理函数中,可以通过调用QStandardItemModel的moveRows方法来实现列表项位置的变化,并更新数组mList中对应元素的位置。
更新视图显示。当数组mList中元素位置发生变化后,需要重新设置模型数据并刷新视图,以便正确显示最新的列表项顺序。
下面是一个示例代码:
// 定义测试节点类
class TestNode {
public:
QString name;
};
// 创建数据模型
QStandardItemModel* model = new QStandardItemModel();
model->setColumnCount(1);
// 设置视图表头
QStringList headerLabels;
headerLabels << "Name";
model->setHorizontalHeaderLabels(headerLabels);
// 添加测试节点到数据模型和数组 mList 中
std::vector<TestNode*> mList;
for (int i = 0; i < 5; ++i) {
TestNode* node = new TestNode();
node->name = QString("Test Node %1").arg(i+1);
mList.push_back(node);
QStandardItem* item = new QStandardItem(node->name);
model->setItem(i, 0, item);
}
// 创建视图 tblTestNode 并设置模型
QTableView* tblTestNode = new QTableView();
tblTestNode->setModel(model);
// 设置视图支持拖拽操作
tblTestNode->setDragEnabled(true);
tblTestNode->setAcceptDrops(true);
tblTestNode->setDefaultDropAction(Qt::MoveAction);
// 处理拖拽事件,实现列表项位置变化和数组 mList 中元素位置变化
void TestNodeWindow::dragMoveEvent(QDragMoveEvent *event) {
if (event->mimeData()->hasFormat("application/x-qabstractitemmodeldatalist")) {
event->acceptProposedAction();
}
}
void TestNodeWindow::dropEvent(QDropEvent *event) {
QByteArray encodedData = event->mimeData()->data("application/x-qabstractitemmodeldatalist");
QDataStream stream(&encodedData, QIODevice::ReadOnly);
int row, col;
QMap<int, QVariant> roleDataMap;
stream >> row >> col >> roleDataMap;
// 获取目标行号
QModelIndex index = tblTestNode->indexAt(event->pos());
int targetRow = index.row();
// 检查目标行号是否有效
if (targetRow < 0 || targetRow >= model->rowCount()) {
event->ignore();
return;
}
// 获取源行号和数量
int sourceRow = row / model->columnCount();
int count = roleDataMap.count() / model->columnCount();
// 移动数据模型中的行
bool success = model->moveRows(QModelIndex(), sourceRow, count,
QModelIndex(), targetRow);
// 更新数组 mList 中元素位置
if (success) {
std::vector<TestNode*> newList(mList.size());
for (int i = 0; i < mList.size(); ++i) {
int newIndex = model->index(i, 0).row();
newList[newIndex] = mList[i];
}
mList.swap(newList);
}
event->acceptProposedAction();
}
// 刷新视图
void TestNodeWindow::refreshView() {
for (int i = 0; i < model->rowCount(); ++i) {
QModelIndex index = model->index(i, 0);
QStandardItem* item = model->itemFromIndex(index);
item->setText(mList[i]->name);
}
tblTestNode->reset();
}




