QComboBox中使用树形控件进行选择

事情是这样的,要在一个ComboBox中通过树形结构进行内容的选择。

默认的QComboBox展开是下拉的列表。因此需要定制一下。

效果就是这样的

 实现上面效果的核心代码就是下面这样的

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    tree=new QTreeWidget(this);

    auto* top=new QTreeWidgetItem({"A"});
    tree->addTopLevelItem(top);

    auto* child=new QTreeWidgetItem(top,{"A1"});
    new QTreeWidgetItem(top,{"A2"});
    new QTreeWidgetItem(top,{"A3"});
    new QTreeWidgetItem(child,{"AA1"});
    new QTreeWidgetItem(child,{"AA2"});

    top=new QTreeWidgetItem({"B"});
    tree->addTopLevelItem(top);
    child=new QTreeWidgetItem(top,{"B1"});
    new QTreeWidgetItem(top,{"B2"});
    new QTreeWidgetItem(top,{"B3"});
    new QTreeWidgetItem(child,{"BB1"});
    new QTreeWidgetItem(child,{"BB2"});
    cbx=new QComboBox(this);
    cbx->setEditable(true);
    cbx->setModel(tree->model());
    cbx->setView(tree);

    tree->expandAll();
    this->setCentralWidget(cbx);

}
 

现在有一个问题!

点击树中的任何item,树都会收起来,然后关闭掉。

这不是想要的效果,想要的效果是,点击树中的非最底层节点,树的层级会相应的收起来或者展开。而点击最底层的节点,则选中相应的item,收起来

一个实现方法是,通过事件处理来解决:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    tree=new QTreeWidget(this);
    cbx=new QComboBox(this);
    cbx->setEditable(true);

    auto* top=new QTreeWidgetItem({"A"});
    tree->addTopLevelItem(top);

    auto* child=new QTreeWidgetItem(top,{"A1"});
    new QTreeWidgetItem(top,{"A2"});
    new QTreeWidgetItem(top,{"A3"});
    new QTreeWidgetItem(child,{"AA1"});
    new QTreeWidgetItem(child,{"AA2"});

    top=new QTreeWidgetItem({"B"});
    tree->addTopLevelItem(top);
    child=new QTreeWidgetItem(top,{"B1"});
    new QTreeWidgetItem(top,{"B2"});
    new QTreeWidgetItem(top,{"B3"});
    new QTreeWidgetItem(child,{"BB1"});
    new QTreeWidgetItem(child,{"BB2"});


    //在这里设置时,无法过滤MouseButtonRelease事件
//    tree->viewport()->installEventFilter(this);
    cbx->setModel(tree->model());
    cbx->setView(tree);

    tree->expandAll();

    //在这里设置时,可以过滤MouseButtonRelease事件
    tree->viewport()->installEventFilter(this);

    this->setCentralWidget(cbx);

}
 

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{

    if(watched==tree->viewport())
    {
        qDebug()<<"event of tree";
        qDebug()<<"event:"<<event;
        if(event->type()==QEvent::MouseButtonPress)
            return true;

        if(event->type()==QEvent::MouseButtonRelease)
        {
            qDebug()<<"event of tree MouseButtonRelease";
            QMouseEvent* ee=static_cast<QMouseEvent*>(event);
            QModelIndex index=tree->indexAt(ee->pos());
            if(!index.isValid())
                return false;
            QTreeWidgetItem* item= static_cast<QTreeWidgetItem*>(index.internalPointer());
            if(item->childCount()!=0)
            {
                if(tree->isExpanded(index))
                {
                    tree->collapse(index);
                }
                else
                    tree->expand(index);

            }
            else
            {
                qDebug()<<"item selected::"<<item->text(0);
//                cbx->setEditText(item->text(0));
                cbx->setCurrentText(item->text(0));
                cbx->hidePopup();

            }
            return true;
        }
    }

    return QObject::eventFilter(watched,event);
}
 

其中下面这句代码目的是实现点击树的下拉三角时不响应两次,响应两次将导致一次点击打开又关闭

        if(event->type()==QEvent::MouseButtonPress)
            return true;

软件产品展示

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

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

相关文章

Error: The Calculated NPWS= 84330 != The Read NPWS= 84328

Tutorials — VASPKIT 1.5 documentation 设置PRECN 或者降低截断能 To aviod the error ’ERROR! Computed NPLANE **** ! input NPLANE ****’, please set PRECN or a medium/lower value of energy cuttoff.

【网络协议】路由信息协议 (RIP)

未经许可&#xff0c;不得转载。 路由信息协议&#xff08;Routing Information Protocol&#xff0c;简称 RIP&#xff09;是一种使用跳数&#xff08;hop count&#xff09;作为路由度量标准的路由协议&#xff0c;用于确定源网络和目标网络之间的最佳路径。 文章目录 什么是…

LoRA微调系列笔记

系列文章目录 第一章&#xff1a;LoRA微调系列笔记 第二章&#xff1a;Llama系列关键知识总结 第三章&#xff1a;LLaVA模型讲解与总结 文章目录 系列文章目录LoRA&#xff1a;Low-Rank Adaptation of Large Language Models目的&#xff1a;依据&#xff1a;优势&#xff1a;…

在K8S中,节点状态哪个组件负责上报?

在Kubernetes中&#xff0c;节点状态是kubelet组件负责定期上报的。Kubelet是运行在每个节点上的代理程序&#xff0c;它与Kubernetes Master节点上的控制面板组件紧密协作&#xff0c;以确保节点上的Pod能够正确运行。 kubelet的主要职责之一就是&#xff1a;与Kubernetes API…

SRS 服务器入门:实时流媒体传输的理想选择

在当今视频流媒体需求爆炸式增长的时代&#xff0c;如何选择一款高效、稳定且功能强大的流媒体服务器成为了许多开发者和企业关注的焦点。而 SRS&#xff08;Simple Realtime Server&#xff09;作为一款开源的流媒体服务器&#xff0c;以其卓越的性能和灵活的功能&#xff0c;…

C++第五六单元测试

1【单选题】在公有派生类的成员函数不能直接访问基类中继承来的某个成员&#xff0c;则该成员一定是基类中的&#xff08; C &#xff09;。&#xff08;2.0分&#xff09; A、公有成员B、保护成员C、私有成员D、保护成员或私有成员 注意从类外访问与从派生类中访问 2【单…

JPA查询部分字段的最佳实践

最近在接手一个项目&#xff0c;用的是JPA&#xff0c;以前没使用过。在开发新的需求过程中&#xff0c;发现有查询部分字段的情况&#xff0c;网上逛了半天&#xff0c;发现都是抄来抄去的“古文”。于是用英文搜索了下&#xff0c;总结了以下几点。 版本信息&#xff1a;Spr…

Spring Boot + Redisson 封装分布式锁

目标&#xff1a;一行代码调用&#xff0c;简单粗暴。 基操&#xff1a;自动加锁&#xff0c;自动解锁&#xff0c;自动处理异常&#xff0c;自动处理锁超时等。 安装 redis redisson <dependency><groupId>org.springframework.boot</groupId><artifac…

使用Python可视化有压缩格式的Bitmap(BMP)图像调色板数据

使用Python可视化有压缩格式的Bitmap BMP图像调色板数据 参考文章一、调色板数据二、测试代码三、测试结果 参考文章 有压缩格式的Bitmap(BMP)图像显示调色板数据和图像数据Bitmap(BMP)图像信息分析主要说明带压缩的形式Bitmap(BMP)图像信息验证 一、调色板数据 Color Palette…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…

Day62 图论part11

Floyd 算法精讲 Floyd 算法代码很简单&#xff0c;但真正理解起原理 还是需要花点功夫&#xff0c;大家在看代码的时候&#xff0c;会发现 Floyd 的代码很简单&#xff0c;甚至看一眼就背下来了&#xff0c;但我为了讲清楚原理&#xff0c;本篇还是花了大篇幅来讲解。 代码随想…

html+css+js网页设计 美食 美食家6个页面

htmlcssjs网页设计 美食 美食家6个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xf…

21. 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--补充--自动添加角色可访问接口

上一篇文章我们一起编写了自动添加接口地址&#xff0c;这一篇文章我们补充简易权限中的自动添加角色可访问接口。 一 实现 首先&#xff0c;我们Initialization文件夹下新建AddRolePath类&#xff0c;这个类用于初始化数据库中SysRoleUrl表&#xff0c;代码如下&#xff1a;…

标准库以及HAL库——按键控制LED灯代码

按键控制LED本质还是控制GPIO,和点亮一个LED灯没什么区别 点亮一个LED灯&#xff1a;是直接控制输出引脚&#xff0c;GPIO初始化推挽输出即可 按键控制LED&#xff1a;是按键输入信号从而控制输出引脚&#xff0c;GPIO初始化推挽输出一个引脚以外还得加一个GPIO上拉输入 但是…

关于Camunda工作流的使用后的记录

服务器机器2台&#xff0c;8u32G 服务器负载长期极低,近30日监控数据&#xff0c;CPU 1分钟负载高峰时不到0.2 数据库机器单台&#xff0c;4u16G 数据库总连接数&#xff1a;最大值47&#xff0c;最小值16 CPU使用率&#xff1a;最大值25.7%&#xff0c;最小值6% IOPS(单位时间…

Java的list中状态属性相同返回true的实现方案

文章目录 项目背景方案一、for循环实现实现思路 方案二、stream实现实现思路 项目背景 在项目中会遇到list中多个状态判断&#xff0c;状态值相等时&#xff0c;总体返回为true。 方案一、for循环实现 实现思路 遍历list&#xff0c;当出现不一致时&#xff0c;直接跳出循环…

模型选择+过拟合欠拟合

训练误差和泛化误差 训练误差&#xff1a;模型在训练数据上的误差 泛化误差&#xff1a;模型在新数据上的误差 验证数据集&#xff1a;一个用来评估模型好坏的数据集 例如拿出50%的数据作为训练 测试数据集&#xff1a;只能用一次 K则交叉验证 在没有足够数据时使用 算法…

Web安全攻防入门教程——hvv行动详解

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中&#xff0c;保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现&#xff0c;还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻防…

Qt仿音乐播放器:QFileDialog添加本地文件

一、套路 QFileDialog fileDialog(this);// 创建对话框&#xff0c;并设置父元素&#xff1b;fileDialog.setWindowTitle("添加本地下载的音乐");//设置窗口标题//设置文件对话框的默认打开路径 QString projectPathQDir::currentPath();//获取当前目录 QDir dir(pr…

语音识别基础算法——动态时间规整算法

前言 动态时间规整算法&#xff0c;Dynamic Time Wraping&#xff0c;缩写为DTW&#xff0c;是语音识别领域的一个基础算法。 算法的提出 DTW 的提出是为了解决或尽量解决在语音识别当中的孤立词识别不正确的问题。该问题简单描述为&#xff1a;在识别阶段&#xff0c;将输入…