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

相关文章

mysql如何查看当前连接数

《mysql如何查看当前连接数》:本文主要介绍mysql如何查看当前连接数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql查看当前连接数查看mysql数据库允许最大连接数总结mysql查看当前连接数查看当前连接数SHOW STATUS LIKE

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

【前端学习】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 |