Qtreeview改变当前节点的名称

2023-10-16 04:12

本文主要是介绍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);

这篇关于Qtreeview改变当前节点的名称的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218967

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06

JS和jQuery获取节点的兄弟,父级,子级元素

原文转自http://blog.csdn.net/duanshuyong/article/details/7562423 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素。 <div id="test"><div></div><div></div

Weex入门教程之4,获取当前全局环境变量和配置信息(屏幕高度、宽度等)

$getConfig() 获取当前全局环境变量和配置信息。 Returns: config (object): 配置对象;bundleUrl (string): bundle 的 url;debug (boolean): 是否是调试模式;env (object): 环境对象; weexVersion (string): Weex sdk 版本;appName (string): 应用名字;

Linux 删除 当前下的 mysql-8.0.31 空文件夹

在Linux中,如果你想要删除当前目录下的名为mysql-8.0.31的空文件夹(即该文件夹内没有任何文件或子文件夹),你可以使用rmdir命令。但是,如果mysql-8.0.31文件夹并非完全为空(即它包含文件或子文件夹),rmdir命令会失败。 如果你的目标是删除mysql-8.0.31文件夹及其内部的所有内容(无论是否为空),你应该使用rm命令结合-r(或-R,它们是等价的)选项来递归地删

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

react笔记 8-18 事件 方法 定义方法 获取/改变数据 传值

1、定义方法并绑定 class News extends React.Component {constructor(props) {super(props)this.state = {msg:'home组件'}}run(){alert("我是一个run") //方法写在类中}render() {return (<div><h2>{this.state.msg}</h2><button onCli