Qtreeview改变当前节点的名称

setContextMenuPolicy(Qt::CustomContextMenu); 

通过创建一个结构体对象,将该对象绑定到该节点上,并且进行该节点的信息保存.

#include <QApplication>
#include <QTreeView>
#include <QStandardItemModel>
#include <QStandardItem>
#include <QString>
#include <QDebug>// 定义一个结构体 Name
struct Name {QString name;int value;
};int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建一个标准项模型QStandardItemModel model;// 创建根节点QStandardItem* rootNode = new QStandardItem("Root Node");// 创建 Name 结构体的实例Name nameData;nameData.name = "John";nameData.value = 42;// 将 Name 结构体实例保存为 QVariant,并关联到根节点上QVariant customData = QVariant::fromValue(nameData);// 创建一个标准项,并设置其文本为 Name 结构体的 name 成员QStandardItem* item = new QStandardItem(customData.value<Name>().name);// 将关联的 QVariant 数据保存到标准项的 UserRole 角色上item->setData(customData, Qt::UserRole);// 将标准项添加到根节点下rootNode->appendRow(item);// 将根节点添加到模型中model.appendRow(rootNode);// 创建树形视图并设置模型QTreeView treeView;treeView.setModel(&model);// 显示树形视图treeView.show();// 获得标签的名字QString name = item->text();QVariant retrievedData = item->data(Qt::UserRole); // 获取关联的 QVariant 数据// read data from iten  Name retrievedNameData = retrievedData.value<Name>(); // 将 QVariant 转换为 Name 结构体的实例qDebug() << "Name: " << retrievedNameData.name;qDebug() << "Value: " << retrievedNameData.value;qDebug() << "name: " << name;return app.exec();
}

void QStandardItem::setData(const QVariant &value, int role = Qt::UserRole + 1)

将给定角色的项数据设置为指定

​//将自定义的结构体对象绑定对象
void QStandardItem::setData(const QVariant &value, int role = Qt::UserRole + 1)

改变当前的节点的名称

QObject::connect(&treeView, &QTreeView::doubleClicked, [&](const QModelIndex &index) {if (index.isValid()) {// 获取当前节点的文本QString oldName = index.data().toString();// 使用QLineEdit进行编辑QLineEdit *edit = new QLineEdit();edit->setText(oldName);edit->setAlignment(Qt::AlignCenter);// 将QLineEdit作为节点的编辑器treeView.setIndexWidget(index, edit);// 当编辑器失去焦点时,保存新的节点名称QObject::connect(edit, &QLineEdit::editingFinished, [=]() {QString newName = edit->text();// 保存新的节点名称,这里你可以将其存储到合适的数据结构中qDebug() << "节点" << oldName << "被重命名为" << newName;// 移除编辑器,显示新的节点名称treeView.setIndexWidget(index, nullptr);// 更新模型中的数据model.setData(index, newName);});}});

右键点击事件

void MainWindow::slotTreeMenu(const QPoint &pos)
{QModelIndex curIndex = ui->treeView->indexAt(pos);      //当前点击的元素的indexQModelIndex index = curIndex.sibling(curIndex.row(),0); //该行的第1列元素的indexif (index.isValid()){if(index.parent() != ui->treeView->rootIndex())     //不是一级节点,因为只对二级节点往其他年级移动{QMenu menu;QAction* actionParent = menu.addAction(QStringLiteral("移动到年级"));    //父菜单QMenu* subMenu = new QMenu(&menu);  //子菜单subMenu->addAction(QStringLiteral("1年级"), this, SLOT(slotTreeMenuMove(bool)));subMenu->addAction(QStringLiteral("2年级"), this, SLOT(slotTreeMenuMove(bool)));subMenu->addAction(QStringLiteral("3年级"), this, SLOT(slotTreeMenuMove(bool)));actionParent->setMenu(subMenu);menu.exec(QCursor::pos());}}
}void MainWindow::slotTreeMenuMove(bool checked)
{//通过action的文本可以判断选择的哪个子菜单,如果文本不够用也可以用data接口QAction* action = qobject_cast<QAction*>(sender());QString grade = action->text();//执行移动//...
}

要先设置菜单策略,使用接口:

setContextMenuPolicy(Qt::CustomContextMenu); 

建立对应的时间连接

connect(t, &QTreeView::customContextMenuRequested, this, &MainWindow::slotTreeMenu);

带有图标的点击事件

menu.addAction(QIcon(":/image/add.png"),QStringLiteral("添加"), this, SLOT(slotTreeMenuAdd(bool)));
menu.addAction(QIcon(":/image/delete.png"),QStringLiteral("删除"), this, SLOT(slotTreeMenuDelete(bool)));

设计多级的列表

 

void MainWindow::slotTreeMenu(const QPoint &pos)
{QModelIndex curIndex = ui->treeView->indexAt(pos);      //当前点击的元素的indexQModelIndex index = curIndex.sibling(curIndex.row(),0); //该行的第1列元素的indexif (index.isValid()){if(index.parent() != ui->treeView->rootIndex())     //不是一级节点,因为只对二级节点往其他年级移动{QMenu menu;QAction* actionParent = menu.addAction(QStringLiteral("移动到年级"));    //父菜单QMenu* subMenu = new QMenu(&menu);  //子菜单subMenu->addAction(QStringLiteral("1年级"), this, SLOT(slotTreeMenuMove(bool)));subMenu->addAction(QStringLiteral("2年级"), this, SLOT(slotTreeMenuMove(bool)));subMenu->addAction(QStringLiteral("3年级"), this, SLOT(slotTreeMenuMove(bool)));actionParent->setMenu(subMenu);menu.exec(QCursor::pos());}}
}void MainWindow::slotTreeMenuMove(bool checked)
{//通过action的文本可以判断选择的哪个子菜单,如果文本不够用也可以用data接口QAction* action = qobject_cast<QAction*>(sender());QString grade = action->text();//执行移动//...
}

右键菜单事件 

void contextMenuEvent(QContextMenuEvent* event) override {QModelIndex index = indexAt(event->pos());if (index.isValid()) {QMenu contextMenu(this);QAction* action1 = contextMenu.addAction("Action 1");QAction* action2 = contextMenu.addAction("Action 2");// 连接菜单项的点击事件到槽函数connect(action1, &QAction::triggered, this, [=]() {handleAction1(index);});connect(action2, &QAction::triggered, this, [=]() {handleAction2(index);});contextMenu.exec(event->globalPos());}}

QVariant 

QVariant类的作用类似于最常见的Qt数据类型的联合.因为C++禁止联合体包含具有非默认构造函数或析构函数的类型,所以大多数有趣的Qt类不能在联合体中使用。如果没有QVariant,这将是QObject::property()和数据库工作等的问题。

一个QVariant对象一次只保存一个typeId()的值。(Some类型是多值的,例如字符串列表。)你可以找出变量的类型T,使用convert()将其转换为不同的类型,使用其中一个toT()函数获取其值(例如,toSize()),并检查是否可以使用canConvert()将该类型转换为特定类型。

名为toT()的方法(例如toInt(),toString())都是常量。如果您请求存储的类型,它们将返回存储对象的副本。如果你请求一个可以从存储的类型生成的类型,toT()会复制和转换,并保持对象本身不变。如果请求无法从存储类型生成的类型,则结果取决于该类型;有关详细信息,请参阅函数文档。

QDataStream out(...);
QVariant v(123);                // The variant now contains an int
int x = v.toInt();              // x = 123
out << v;                       // Writes a type tag and an int to out
v = QVariant(tr("hello"));      // The variant now contains a QString
int y = v.toInt();              // y = 0 since v cannot be converted to an int
QString s = v.toString();       // s = tr("hello")  (see QObject::tr())
out << v;                       // Writes a type tag and a QString to out
...
QDataStream in(...);            // (opening the previously written stream)
in >> v;                        // Reads an Int variant
int z = v.toInt();              // z = 123
qDebug("Type is %s",            // prints "Type is int"v.typeName());
v = v.toInt() + 100;            // The variant now holds the value 223
v = QVariant(QStringList());    // The variant now holds a QStringList

QVariant值存储在变体中,可以轻松构建任意类型的任意复杂数据结构。这是非常强大和通用的,但可能证明比在标准数据结构中存储特定类型更少的内存和速度效率。

QVariant x;                                // x.isNull() == true
QVariant y = QVariant::fromValue(nullptr); // y.isNull() == true

因为QVariant是Qt Core模块的一部分,它不能提供Qt GUI中定义的数据类型的转换函数,可以使用QVariant::value()或qvariant_cast()模板函数,也就是说,没有toColor()功能。相反,您可以使用QVariant::value()或qvariant_cast()模板函数。举例来说:

QVariant variant;
...
QColor color = variant.value<QColor>();

 QVariant::setValue(T &&value)

QVariant v;v.setValue(5);
int i = v.toInt();         // i is now 5
QString s = v.toString();  // s is now "5"MyCustomStruct c;
v.setValue(c);...MyCustomStruct c2 = v.value<MyCustomStruct>();

QVariant QVariant::fromValue(const T &value)

返回一个包含value副本的QVariant。在其他方面与setValue()完全相同。

MyCustomStruct s;
return QVariant::fromValue(s);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/106761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安捷伦N8485A射频传感器26.5GHz

安捷伦N8485A射频传感器 N8485A 是 Agilent 使用的 26.5 GHz 0.1 瓦射频传感器。电子测试设备传感器测量波形的功率&#xff0c;例如多音和调制射频 (RF) 波形。传感器使用二极管检测器收集高度精确的调制测量值。 用于存储校准系数的 EEPROM 消除了手动输入 10 MHz 至 26.5 GH…

15 | JPA 对 Web MVC 开发者做了哪些支持

我们使用 Spring Data JPA 的时候&#xff0c;一般都会用到 Spring MVC&#xff0c;Spring Data 对 Spring MVC 做了很好的支持&#xff0c;体现在以下几个方面&#xff1a; 支持在 Controller 层直接返回实体&#xff0c;而不使用其显式的调用方法&#xff1b;对 MVC 层支持标…

解读 | 自动驾驶系统中的多视点三维目标检测网络

原创 | 文 BFT机器人 01 背景 多视角三维物体检测网络&#xff0c;用于实现自动驾驶场景高精度三维目标检测&#xff0c;该网络使用激光雷达点云和RGB图像进行感知融合&#xff0c;以预测定向的三维边界框&#xff0c;相比于现有技术&#xff0c;取得了显著的精度提升。同时现…

MNE系列教程1——MNE的安装与基本绘图

一、MNE包简介 MNE-Python是一个强大的Python库,专门用于脑电图(EEG)和磁共振成像(MRI)数据的分析和可视化。它提供了广泛的工具,使研究人员能够高效地处理神经科学数据。 MNE-Python支持许多数据格式,包括标准的EEG和MEG文件格式,以及不同类型的MRI数据。它可以用于…

树莓派:64位 RPI OS(Bookworm) 更换国内源

几天前新的RPI OS发布了。官方的发版说明里明确注明已经基于Debian Bookworm了。总的来说切到国内源&#xff08;清华&#xff09;跟Bullseye差不多&#xff0c;细节上只有一丢丢不同&#xff08;non-free变成了non-free-firmware&#xff09;。 老规矩&#xff0c;仍然是修改…

内存管理-分页、虚拟地址、虚拟内容、页面置换算法

文章目录 一、5W2H角度分析内存管理What是内存管理Why需要内存管理Who使用内存管理Where内存管理应用When需要内存管理How内存管理工作How much内存管理的成本 二、分页什么是分页分页的原理分页的优缺点分页的应用 三、虚拟地址什么是虚拟地址虚拟地址的作用虚拟地址的转换虚拟…

华为数通方向HCIP-DataCom H12-831题库(单选题:241-260)

第241题 某园区部署了IPV6进行业务测试,该网络中有4台路由器(R1R2、R3和R),运行OSPFV3实现Pv6网络的互联互通。有一台新的路由器R5需要接入网络进行测试,某工程师通过在R4的OSPFV3进程中引入直连路由,实现园区网内的设备能够访问R5的GEO/0/1口地址。关千该场景的描述,错误…

cv_for_nlp

import paddle import numpy as np import pandas as pd from tqdm import tqdmclass FeedFroward(paddle.nn.Layer):def __init__(self, hidden_dim):super

Spring(17) AopContext.currentProxy() 类内方法调用切入

目录 一、简介二、代码示例2.1 接口类2.2 接口实现类2.3 AOP切面类2.4 启动类&#xff08;测试&#xff09;2.5 执行结果 一、简介 背景&#xff1a; 在之前 Spring 的 AOP 用法中&#xff0c;只有代理的类才会被切入。例如&#xff1a;我们在 Controller 层调用 Service 的方式…

DID赛道前列的生物识别技术,开启Web3时代的大门—MXT

互联网发展的十字路口 互联网从上世纪90年代初发展至今&#xff0c;历经30年&#xff0c;她改变了整个人类的生活方式、沟通形式以及社会发展模式&#xff0c;她的影响早已渗透到了世界的各个角落。而如今&#xff0c;我们似乎正站在一个新的十字路口&#xff0c;一个互联网将…

155M传输分析仪 优劣势分析

D240S SDH测试模块&#xff0c;是FT100智能网络测试平台产品家族的一部分&#xff0c;是一个坚固耐用、锂电池超长供电的传统PDH/SDH测试解决方案&#xff0c;支持155Mbps到2.048Mbps速率的传输链路测试。支持在线和离线的传输链路的安装、维护和故障排除应用测试。 同时为经验…

Python自动化测试框架:unittest介绍

Unittest是Python中最常用的测试框架之一&#xff0c;它提供了丰富和强大的测试工具和方法&#xff0c;可以帮助开发者更好地保证代码质量和稳定性&#xff0c;本文就来介绍下Unittest单元测试框架。 1. 介绍 unittest是Python的单元测试框架&#xff0c;它提供了一套丰富的测…

七、K8S之DaemonSet

DaemonSet 一、概念 DaemonSet 是一个针对节点的Pod控制器&#xff0c;确保全部或者某些节点上运行一个Pod副本。当有节点加入集群时&#xff0c;也会为他们新增一个Pod。节点从集群移除&#xff0c;Pod也会被回收&#xff0c;删除DaemonSet 将会删除它创建的所有Pod。 Daem…

VSCode怎么创建Java项目

首先安装好Java的开发环境&#xff1a;JDK在VSCode中安装适用于Java开发的插件。打开VSCode&#xff0c;点击左侧的扩展图标&#xff0c;搜索并安装Java Extension Pack插件。等待安装完成后&#xff0c;重启VSCode生效。创建一个新的Java项目&#xff0c;按下Ctrl Shift P&a…

稀里糊涂的转义

一、前言 前段时间挖机ERP系统出现一个问题&#xff0c;表单录入客户名称是 L & Q International Trading Limited&#xff0c;然后页面展示变成 L &amp; Q International Trading Limited&#xff0c;即字符 &变成了&amp&#xff1b;。 二、为什么要转义 &…

嵌入式C语言自我修养《GNU C编译器扩展语法》学习笔记

目录 一、C语言标准和编译器 二、指定初始化 三、宏构造“利器”&#xff1a;语句表达式 四、typeof与container_of宏 五、零长度数组 六、属性声明&#xff1a;section 七、属性声明&#xff1a;aligned 一、C语言标准和编译器 C语言标准的发展过程&#xff1a; ●…

【C++ 学习】字符串(指针形式和数组形式)

字符串 字符串基本知识 字符串是以空字符&#xff08;\0&#xff09;结尾的char类型数组。如下程序&#xff0c;给出了字符串的声明定义方式。 void test(void) {char words[MAXLENGTH] "I am a string in an array.";const char* pt1 "something is point…

哈希表的实现(c语言)

实现哈希表的方法有两种方法&#xff1a;开放寻址法 、链地址法 开放寻址法&#xff1a;在开放寻址法中&#xff0c;所有的元素都存储在哈希表的数组中&#xff0c;冲突发生时会探测下一个可用的位置&#xff0c;直到找到一个空闲的位置。这种方法保持了元素的顺序&#xff0c;…

基于观察者模式设计的框架-REB,使代码模块化

设计模式里面的观察者模式&#xff0c;一直是作者想去设计一套框架来阐述这一个模式&#xff0c;因此REB(Rice Event Broker)就是为了完成观察者模式的一个框架。 观察者模式 聊REB之前&#xff0c;我们聊聊观察者模式带给我们特性&#xff0c;他能对我们框架设计提供什么好处…

双十一期间如何抢占流量,打造品牌爆款产品

进入10月末&#xff0c;也就进入了电商行业的大促流量红利期。如何提前规划大促期间&#xff0c;店铺流量扩张的计划&#xff0c;提前抢占流量&#xff0c;是每一个品牌方都需要考虑的问题。今天为大家分享下双十一期间如何抢占流量&#xff0c;打造品牌爆款产品&#xff01; 一…