我有一个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());
}
}
测试效果图