ZBLOG

C++和QT中,已知结点存放在数组vector mList;视图为tblTestNode并setModel(QStandardItemModel),如果通过鼠标拖拽视图tblTestNode的数据模型列表项实现数组列表中mList;元素位置的交换,从而实现视图中的列表项位置的变化

可以通过以下步骤实现:

  1. 为视图tblTestNode添加拖拽功能,使其能够响应鼠标拖拽操作。可以使用QTableView的setDragEnabled和setAcceptDrops方法来实现。

  2. 实现列表项位置的变化。当用户在视图中进行了列表项的拖拽操作时,会触发QTableView的dragMoveEvent和dropEvent事件,在这些事件处理函数中,可以通过调用QStandardItemModel的moveRows方法来实现列表项位置的变化,并更新数组mList中对应元素的位置。

  3. 更新视图显示。当数组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();
}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=6598

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?