qt的treewidget的节点 问题

我有一个treewidget树,在点击修改节点的时候会有一个对话框,里面会有一些行编辑框比如节点名称,参数,图标,类型这些东西,要怎么做在打开这个对话框的时候显示每个节点独有的数据,修改后也会有相应的改变

可以给Item设置值,创建item的时候调用item->setData(),QVariant参数可以放map,里面存储你这个节点配置信息的键值对,点击节点的时候将item里的data取出来转换成map,之后用map数据给对话框界面初始化。修改数据之后保存的时候在重新组成map设置给item就可以了。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMap>
#include <QTreeWidgetItem>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void treeItemClicked(QTreeWidgetItem *item, int column);

private:
    void init();

    QMap<QString, QString> createMap(int iNum);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTreeWidgetItem>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    init();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::init()
{
    ui->treeWidget->clear();

    // 根节点
    QTreeWidgetItem* root = new QTreeWidgetItem();
    root->setText(0, "root");
    ui->treeWidget->addTopLevelItem(root);

    // 子节点
    for (int i = 0; i < 5; ++i)
    {
        QTreeWidgetItem* item = new QTreeWidgetItem;
        // item名称
        item->setText(0, QString::number(i));

        // item值
        QVariant varData;

        // map根据自己需要自己配置属性
        varData.setValue(createMap(i));
        item->setData(0, Qt::UserRole, varData);
        root->addChild(item);
    }

    connect(ui->treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(treeItemClicked(QTreeWidgetItem*, int)));
}

QMap<QString, QString> MainWindow::createMap(int iNum)
{
    QMap<QString, QString> dataMap;
    dataMap.insert("参数", QString::number(iNum));
    dataMap.insert("图标", QString::number(iNum));
    dataMap.insert("类型", QString::number(iNum));
    return dataMap;
}

void MainWindow::treeItemClicked(QTreeWidgetItem *item, int column)
{
    if (!item)
    {
        return;
    }

    QMap<QString, QString> dataMap = item->data(0, Qt::UserRole).value<QMap<QString, QString>>();

    // 创建你的QDialog,把map传进去,然后保存的时候在包map赋值给item


    // 测试输出
    ui->textEdit->clear();
    for (auto iter = dataMap.constBegin(); iter != dataMap.constEnd(); ++iter)
    {
        ui->textEdit->append(iter.value());
    }
}

测试效果图
图片说明