weixin_45367687 2020-04-15 11:07 采纳率: 50%
浏览 619
已采纳

qt的treewidget的节点 问题

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

  • 写回答

1条回答 默认 最新

  • zx289544730 2020-04-15 11:37
    关注

    可以给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());
        }
    }
    

    测试效果图
    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3