QTreeWidget——信号处理

文章目录

  • 基本属性
  • 信号
    • 一、信号种类
    • 二、信号测试
      • 1、currentItemChanged、itemCollapsed、itemExpanded三个信号的测试
      • 2、itemActivated信号
      • 3、 itemChanged信号
      • 4、其余信号的测试代码(包含以上代码)

基本属性

信号

一、信号种类

//当前项发生变化时触发,使用后不会触发itemClicked、itemDoubleClicked这两个信号,支持鼠标和键盘触发
void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)

//伸展子项和收缩子项
void itemCollapsed(QTreeWidgetItem *item)
void itemExpanded(QTreeWidgetItem *item)

//激活项时触发
void itemActivated(QTreeWidgetItem *item, int column)

//测试发现只对一级节点的触发有响应
void itemChanged(QTreeWidgetItem *item, int column)

//鼠标单击触发
void itemClicked(QTreeWidgetItem *item, int column)

//鼠标双击触发
void itemDoubleClicked(QTreeWidgetItem *item, int column)

//鼠标光标的移动到项上时触发,前提打开鼠标跟踪
void itemEntered(QTreeWidgetItem *item, int column)

//鼠标按下时触发
void itemPressed(QTreeWidgetItem *item, int column)

//当项发生变化时,可以通过键盘上下键触发
void itemSelectionChanged()

二、信号测试

1、currentItemChanged、itemCollapsed、itemExpanded三个信号的测试

测试效果:

在这里插入图片描述在这里插入图片描述
部分测试代码

int MainWindow::setTreeItem()
{
    //关掉默认的展开图标
    ui->m_treeWidget->setRootIsDecorated(false);

    QFont font("黑体",16);

    //创建一级父类项
    QTreeWidgetItem *item_parent = new QTreeWidgetItem(ui->m_treeWidget);
    item_parent->setIcon(0,QIcon(":/new/prefix1/picture/Down.png"));

    //设置一列数据
    ui->m_treeWidget->setColumnCount(1);
    item_parent->setFont(0,font);
    //item_parent->setTextColor(0,Qt::white);
    item_parent->setText(0,QString::fromLocal8Bit("设备信息"));

    //添加二级项
    QTreeWidgetItem *item_child = new QTreeWidgetItem(item_parent);
    item_child->setIcon(0,QIcon(":/new/prefix1/picture/AP.png"));
    item_child->setTextAlignment(0,Qt::AlignLeft | Qt::AlignVCenter);
    item_child->setText(0,QString::fromLocal8Bit("设备一"));
    item_child->setSelected(false);

    //所选项的展开与收缩信号
    connect(ui->m_treeWidget,SIGNAL(itemExpanded(QTreeWidgetItem *)),this,
            SLOT(On_DouClickedTreeOpen_Slots(QTreeWidgetItem *)));
    connect(ui->m_treeWidget,SIGNAL(itemCollapsed(QTreeWidgetItem *)),this,
            SLOT(On_DouClickedTreeClose_Slots(QTreeWidgetItem *)));


    connect(ui->m_treeWidget,SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),this,
            SLOT(On_CurrentItemChanged_Slots(QTreeWidgetItem *,QTreeWidgetItem *)));

    return 0;
}

void MainWindow::On_DouClickedTreeClose_Slots(QTreeWidgetItem *item)
{
    item->setIcon(0,QIcon(":/new/prefix1/picture/Down.png"));
}

void MainWindow::On_CurrentItemChanged_Slots(QTreeWidgetItem *curren, QTreeWidgetItem *previous)
{
    if(previous != NULL)
     qDebug()<<curren->text(0)<<previous->text(0);
}

void MainWindow::On_DouClickedTreeOpen_Slots(QTreeWidgetItem *item)
{
    item->setIcon(0,QIcon(":/new/prefix1/picture/Up.png"));
}

子项伸展和收缩的应用测试
在这里插入图片描述

void MainWindow::init()
{
    //关闭头部信息
    ui->m_treeWidget->header()->setVisible(false);

    //关掉默认的展开图标
    ui->m_treeWidget->setRootIsDecorated(false);

    //初始qtree的宽高
    ui->m_treeWidget->setFixedSize(T_WIDTH,T_HEIGHT);

    //禁用滑动块
    ui->m_treeWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->m_treeWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    setTreeItem();
}

int MainWindow::setTreeItem()
{
    QFont font("黑体",16);

    //创建一级父类项
    QTreeWidgetItem *item_parent = new QTreeWidgetItem(ui->m_treeWidget);

    item_parent->setSizeHint(0,QSize(C_WIDTH,C_HEIGHT));

    item_parent->setIcon(0,QIcon(":/new/prefix1/picture/Down.png"));

    //设置一列数据
    ui->m_treeWidget->setColumnCount(1);
    item_parent->setFont(0,font);

    item_parent->setText(0,QString::fromLocal8Bit("设备信息"));

    //设置对齐方式
    item_parent->setTextAlignment(0,Qt::AlignVCenter);
    addChildItem(item_parent);

    //所选项的展开与收缩信号
    connect(ui->m_treeWidget,SIGNAL(itemExpanded(QTreeWidgetItem *)),this,
            SLOT(On_DouClickedTreeOpen_Slots(QTreeWidgetItem *)));
    connect(ui->m_treeWidget,SIGNAL(itemCollapsed(QTreeWidgetItem *)),this,
            SLOT(On_DouClickedTreeClose_Slots(QTreeWidgetItem *)));


    connect(ui->m_treeWidget,SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),this,
            SLOT(On_CurrentItemChanged_Slots(QTreeWidgetItem *,QTreeWidgetItem *)));
    return 0;
}
void MainWindow::On_DouClickedTreeOpen_Slots(QTreeWidgetItem *item)
{
    if(item->text(0) == QString::fromLocal8Bit("设备信息"))
    {
        item->setIcon(0,QIcon(":/new/prefix1/picture/Up.png"));

        //根据子节点数目更新宽度
        int num = item->childCount();
        if(num > 0)
        {
            int h = num * C_HEIGHT + T_HEIGHT;
            ui->m_treeWidget->setFixedSize(T_WIDTH,h);
        }
    }


}
void MainWindow::On_DouClickedTreeClose_Slots(QTreeWidgetItem *item)
{
    if(item->text(0) == QString::fromLocal8Bit("设备信息"))
    {
        item->setIcon(0,QIcon(":/new/prefix1/picture/Down.png"));

        //回复默认宽高
        ui->m_treeWidget->setFixedSize(T_WIDTH,T_HEIGHT);
    }
}

2、itemActivated信号

效果图:
在这里插入图片描述测试鼠标双击控制和使用键盘的Enter触发

3、 itemChanged信号

测试发现只对一级节点的触发有响应,这里关闭了所有项的默认图标

//QSS:关闭子项的默认图标
QTreeView::branch:has-children:!has-siblings:closed,
QTreeView::branch:closed:has-children:has-siblings {
border-image: none;
image: none;
}

QTreeView::branch:open:has-children:!has-siblings,
QTreeView::branch:open:has-children:has-siblings {
border-image: none;
image: none;
}

效果图:

在这里插入图片描述

4、其余信号的测试代码(包含以上代码)

void MainWindow::init()
{
    //关闭头部信息
    ui->m_treeWidget->header()->setVisible(false);

    //关掉默认的展开图标
    ui->m_treeWidget->setRootIsDecorated(false);

    //初始qtree的宽高
    ui->m_treeWidget->setFixedSize(T_WIDTH,T_HEIGHT);

    //禁用滑动块
    ui->m_treeWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->m_treeWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

    setTreeItem();
}

int MainWindow::setTreeItem()
{
    QFont font("黑体",16);

    //创建一级父类项
    QTreeWidgetItem *item_parent = new QTreeWidgetItem(ui->m_treeWidget);

    item_parent->setSizeHint(0,QSize(C_WIDTH,C_HEIGHT));

    item_parent->setIcon(0,QIcon(":/new/prefix1/picture/Down.png"));

    //设置一列数据
    ui->m_treeWidget->setColumnCount(1);
    item_parent->setFont(0,font);

    item_parent->setText(0,QString::fromLocal8Bit("设备信息"));

    //设置对齐方式
    item_parent->setTextAlignment(0,Qt::AlignVCenter);
    addChildItem(item_parent);

    //所选项的展开与收缩信号
    connect(ui->m_treeWidget,SIGNAL(itemExpanded(QTreeWidgetItem *)),this,
            SLOT(On_DouClickedTreeOpen_Slots(QTreeWidgetItem *)));
    connect(ui->m_treeWidget,SIGNAL(itemCollapsed(QTreeWidgetItem *)),this,
            SLOT(On_DouClickedTreeClose_Slots(QTreeWidgetItem *)));


    connect(ui->m_treeWidget,SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),this,
            SLOT(On_CurrentItemChanged_Slots(QTreeWidgetItem *,QTreeWidgetItem *)));

    connect(ui->m_treeWidget,SIGNAL(itemActivated(QTreeWidgetItem *, int)),this,
            SLOT(On_ItemActivated_Slots(QTreeWidgetItem *,int)));

    connect(ui->m_treeWidget,SIGNAL(itemChanged(QTreeWidgetItem *, int)),this,
            SLOT(On_ItemChanged_Slot(QTreeWidgetItem *,int)));

    //itemClicked
    connect(ui->m_treeWidget,SIGNAL(itemClicked(QTreeWidgetItem *, int)),this,
            SLOT(On_ItemClicked_Slots(QTreeWidgetItem *,int)));

    connect(ui->m_treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),this,
            SLOT(On_ItemDoubleClicked_Slots(QTreeWidgetItem *,int)));

    connect(ui->m_treeWidget,SIGNAL(itemPressed(QTreeWidgetItem *, int)),this,
            SLOT(On_ItemPressed_Slots(QTreeWidgetItem *,int)));


    connect(ui->m_treeWidget,SIGNAL(itemSelectionChanged()),this,
            SLOT(On_ItemSelectionChanged_Slots()));

    return 0;
}

/**
 * @brief MainWindow::addChildItem 添加二级子项
 * @param parentItem
 */
void MainWindow::addChildItem(QTreeWidgetItem *parentItem)
{
    //添加二级项,为了是效果更加明显多添加几个子节点
    for(int i = 0;i < 6;i++)
    {
        QTreeWidgetItem *item_child = new QTreeWidgetItem(parentItem);
        //itemActivated

        item_child->setSizeHint(0,QSize(C_WIDTH,C_HEIGHT));
        item_child->setIcon(0,QIcon(":/new/prefix1/picture/AP.png"));
        item_child->setTextAlignment(0,Qt::AlignLeft | Qt::AlignVCenter);
        QString test_str = QString::fromLocal8Bit("设备_");
        test_str.append(QString::number(i));
        item_child->setText(0,test_str);
        QTreeWidgetItem *item_child_child = new QTreeWidgetItem(item_child);
        item_child_child->setSizeHint(0,QSize(C_WIDTH,C_HEIGHT));

        item_child_child->setTextAlignment(0,Qt::AlignLeft | Qt::AlignVCenter);
        //item_child->setIcon(0,QIcon(":/new/prefix1/picture/AP.png"));

        item_child_child->setText(0,QString::fromLocal8Bit("信息"));
    }
}

void MainWindow::On_ItemSelectionChanged_Slots()
{
     qDebug()<<QString::fromLocal8Bit("当前项发生改变");
}

void MainWindow::On_DouClickedTreeClose_Slots(QTreeWidgetItem *item)
{
    if(item->text(0) == QString::fromLocal8Bit("设备信息"))
    {
        item->setIcon(0,QIcon(":/new/prefix1/picture/Down.png"));

        //回复默认宽高
        ui->m_treeWidget->setFixedSize(T_WIDTH,T_HEIGHT);
    }
}

void MainWindow::On_ItemActivated_Slots(QTreeWidgetItem *item, int n)
{
    //qDebug()<<item->text(0)<<n;
}

void MainWindow::On_ItemChanged_Slot(QTreeWidgetItem *item, int n)
{
    qDebug()<<item->text(0)<<n;
}

void MainWindow::On_ItemClicked_Slots(QTreeWidgetItem *item, int n)
{
    qDebug()<<QString::fromLocal8Bit("单击")<<item->text(0)<<n;
}

void MainWindow::On_ItemDoubleClicked_Slots(QTreeWidgetItem *item, int n)
{
    qDebug()<<QString::fromLocal8Bit("双击")<<item->text(0)<<n;
}

void MainWindow::On_ItemPressed_Slots(QTreeWidgetItem *item, int n)
{
    qDebug()<<QString::fromLocal8Bit("按下")<<item->text(0)<<n;
}

void MainWindow::On_CurrentItemChanged_Slots(QTreeWidgetItem *curren, QTreeWidgetItem *previous)
{
      //这里做判断是防止代码初始化时出错,因为初始化时previous == NULL
    //    if(previous != NULL)
    //     qDebug()<<curren->text(0)<<previous->text(0);
}

void MainWindow::On_DouClickedTreeOpen_Slots(QTreeWidgetItem *item)
{
    if(item->text(0) == QString::fromLocal8Bit("设备信息"))
    {
        item->setIcon(0,QIcon(":/new/prefix1/picture/Up.png"));

        //根据子节点数目更新宽度
        int num = item->childCount();
        if(num > 0)
        {
            int h = num * C_HEIGHT + T_HEIGHT;
            ui->m_treeWidget->setFixedSize(T_WIDTH,h);
        }
    }


}```

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM——类加载与字节码技术—类文件结构

由源文件被编译成字节码文件&#xff0c;然后经过类加载器进行类加载&#xff0c;了解类加载的各个阶段&#xff0c;了解有哪些类加载器&#xff0c;加载到虚拟机中执行字节码指令&#xff0c;执行时使用解释器进行解释执行&#xff0c;解释时对热点代码进行运行期的编译处理。…

C#__基本特性和使用

// 特性&#xff08;attribute&#xff09;: // 一种允许我们向程序集添加元数据的语言结构 // 用于保存程序结构信息的某种特殊类型的类 // 类似“批注”&#xff0c;用于解释说明 #define IsShowMessage // 宏定义&#xff0c;在开头定义&#xff0…

AutoCompany模型的概念设计,涵盖了AI智能公司的各个角色

AutoCompany模型的概念设计&#xff0c;涵盖了AI智能公司的各个角色 自动化企业概念设计与设想&#xff0c;文本将介绍AutoCompany模型的概念设计&#xff0c;涵盖了AI智能公司的各个角色&#xff0c;并结合了GPT-4接口来实现各个角色的功能&#xff0c;设置中央控制器&#xf…

5、Spring_DI注解开发

DI 注解开发 1.目前面临问题 建立 mapper public interface EmployeeMapper {void save(); }建立 mapper 实现类 Repository public class EmployeeMapperImpl implements EmployeeMapper {public void save(){System.out.println("保存员工信息");} }建立 service …

C++(Qt)软件调试---gdb调试入门用法(12)

gdb调试—入门用法&#xff08;1&#xff09; 文章目录 gdb调试---入门用法&#xff08;1&#xff09;1、前言1.1 什么是GDB1.2 为什么要学习GDB1.3 主要内容1.4 GDB资料 2、C/C开发调试环境准备3、gdb启动调试1.1 启动调试并传入参数1.2 附加到进程1.3 过程执行1.4 退出调试 4…

【《深入浅出计算机网络》学习笔记】第2章 物理层

内容来自b站湖科大教书匠《深入浅出计算机网络》视频和《深入浅出计算机网络》书籍 目录 2.1 物理层概述 2.1.1 物理层要实现的功能 2.1.2 物理层接口特性 2.1.2.1 机械特性 2.1.2.2 电气特性 2.1.2.3 功能特性 2.1.2.4 过程特性 2.2 物理层下面的传输媒体 2.2.1 导向…

网络安全设备篇——加密机

加密机是一种专门用于数据加密和解密的网络安全设备。它通过使用密码学算法对数据进行加密&#xff0c;从而保护数据的机密性和完整性。加密机通常被用于保护敏感数据&#xff0c;如金融信息、个人身份信息等。 加密机的主要功能包括&#xff1a; 数据加密&#xff1a;加密机使…

python知识:什么是字符编码?

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 我们的MySQL使用latin1的默认字符集&#xff0c; 也就是说&#xff0c;对汉字字段直接使用GBK内码的编码进行存储&#xff0c; 当需要对一些有汉字的字段进行拼音排序时&#xff08;特别涉及到类似于名字这样的字段时…

excel统计函数篇2之count系列

1、COUNT(value1,[value2],…):计算参数列表中数字的个数 2、COUNTA(value1,[value2],…)&#xff1a;计算参数列表中值的个数 联想在excel之数学函数、excel中的通配符一文中提到求和函数&#xff1a; SUMIF(range,ceriteria,[sum_range])&#xff1a;对范围内符合指定条件的…

Nginx高可用集群

目录 一.简介二.案例1.实现思路2.配置文件修改3.实现效果故障转移机制 一.简介 以提高应用系统的可靠性&#xff0c;尽可能地减少中断时间为目标&#xff0c;确保服务的连续性&#xff0c;达到高可用的容错效果。例如“故障切换”、“双机热备”、“多机热备”等都属于高可用集…

nginx防盗链

防盗链介绍 通过二次访问&#xff0c;请求头中带有referer&#xff0c;的方式不允许访问静态资源。 我们只希望用户通过反向代理服务器才可以拿到我们的静态资源&#xff0c;不希望别的服务器通过二次请求拿到我们的静态资源。 盗链是指在自己的页面上展示一些并不在自己服务…

C#和Java的大端位和小端位的问题

C#代码里就是小端序,Java代码里就是大端序&#xff0c; 大端位:big endian,是指数据的高字节保存在内存的低地址中&#xff0c;而数据的低字节保存在内存的高地址中&#xff0c;也叫高尾端 小端位:little endian,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存…

RunnerGo性能测试时如何从数据库获取数据

我们在做性能测试或者场景测试时往往需要从数据库中获取一些真实的系统数据让我们配置的场景更加贴合实际。而RunnerGo也是在最近的大版本更新中推出连接数据库功能&#xff0c;本篇文章也给大家讲解一下具体的操作方法和实际应用场景。 配置数据库 首先进入RunnerGo页面&…

ShowMeBug CEO李亚飞受邀参加深圳青年创新创业系列沙龙电子信息专场

7月13日下午&#xff0c;由深圳市科技交流服务中心&#xff08;深圳市科技专家委员会办公室&#xff09;主办&#xff0c;深圳新一代产业园承办的“2023深圳青年创新创业系列沙龙——电子信息专场”活动举行。ShowMeBug CEO李亚飞受邀参加此次活动。 深圳市科学技术协会党组成员…

[.NET/WPF] CommunityToolkit.Mvvm 异步指令

我们在开发中, 经常会有这样的需求: 点击按钮后, 进行一些耗时的工作工作进行时, 按钮不可再次被点击工作进行时, 会显示进度条, 或者 “加载中” 的动画 RelayCommand CommunityToolkit.Mvvm 中的 RelayCommand 除了支持最简单的同步方法, 还支持以 Task 作为返回值的异步方…

k8s集群监控方案--node-exporter+prometheus+grafana

目录 前置条件 一、下载yaml文件 二、部署yaml各个组件 2.1 node-exporter.yaml 2.2 Prometheus 2.3 grafana 2.4访问测试 三、grafana初始化 3.1加载数据源 3.2导入模板 四、helm方式部署 前置条件 安装好k8s集群&#xff08;几个节点都可以&#xff0c;本人为了方便实验k8s集…

记一次项目内存优化--内存泄漏

需求–内存泄漏优化&#xff0c;PSS有所下降&#xff0c; OOM率减少 主要是与某个版本作基准进行对比&#xff08;一般是最新版本的前一个版本作原数据&#xff09;&#xff0c;优化后&#xff0c;PSS有所下降&#xff0c;线上OOM率减少&#xff08;Bugly版本对比&#xff09;…

Unsafe upfileupload

文章目录 client checkMIME Typegetimagesize 文件上传功能在web应用系统很常见&#xff0c;比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后&#xff0c;后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等&#xff0c;然后将其按…

Php“牵手”淘宝商品SKU信息数据采集方法,淘宝API接口申请指南

淘宝天猫商品属性sku信息接口 API 是开放平台提供的一种 API 接口&#xff0c;它可以帮助开发者获取商品的详细信息&#xff0c;包括商品的标题、描述、图片&#xff0c;销量&#xff0c;sku信息等信息。在电商平台的开发中&#xff0c;商品属性接口API是非常常用的 API&#x…

JS中对象数组深拷贝方法

structuredClone() JavaScript 中提供了一个原生 API 来执行对象的深拷贝&#xff1a;structuredClone。它可以通过结构化克隆算法创建一个给定值的深拷贝&#xff0c;并且还可以传输原始值的可转移对象。 当对象中存在循环引用时&#xff0c;仍然可以通过 structuredClone()…