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;

软件产品展示

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

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

相关文章

Unity 读Excel,读取xlsx文件解决方案

Unity读取表格数据 效果&#xff1a; 思路&#xff1a; Unity可以解析Json&#xff0c;但是读取Excel需要插件的帮助&#xff0c;那就把这个功能分离开&#xff0c;读表插件就只管读表转Json&#xff0c;Unity就只管Json解析&#xff0c;中间需要一个存储空间&#xff0c;使用…

Linux之ARM(MX6U)裸机篇----7.蜂鸣器实验

一&#xff0c;蜂鸣器模块 封装步骤&#xff1a; ①初始化SNVS_TAMPER这IO复用为GPIO ②设置SNVS_TAMPPER这个IO的电气属性 ③初始化GPIO ④控制GPIO输出高低电平 bsp_beep.c: #include "bsp_beep.h" #include "cc.h"/* BEEP初始化 */ void beep_init…

前端学习DAY29(1688侧边栏)

完整代码、 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>1688导航条</title><style>…

NLP模型工程化部署

文章目录 一、理论-微服务、测试与GPU1&#xff09;微服务架构2&#xff09;代码测试3&#xff09;GPU使用 二、实践-封装微服务&#xff0c;编写测试用例和脚本&#xff0c;并观察GPU1&#xff09;微服务封装(RestFul和RPC)2&#xff09;测试编写(unit_test\api_test\load_tes…

重生之我在异世界学编程之数据结构与算法:深入队列篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 一、概述二、链表节点结构三、队列结构四、基…

在线机考|2024华为实习秋招春招编程题(最新)——第2题_订单取餐顺序_300分(五)

题目内容 肯德基店销售炸鸡、薯条、可乐三种实物,准备三种食物的速度一样,且三种食物同时制作;三种食物同时制作,按订单顺序进行分发食物。现在有N个订单,每个订单用连续三位数组元素表示,数组的元素是对应食物的份数。N最大为100万,每个订单里每份食物最多100万份。请计…

SAP SD信贷管理后台配置(上)

后台系统功能配置 1、定义信贷控制范围 说明&#xff1a; 信贷控制区域是一个控制单元&#xff0c;用于指定和检查合作伙伴的信用额度&#xff1b;信用控制区域可以包含一个或多个公司&#xff0c;但一个公司无法分配给多个信贷控制区域&#xff1b;在信用控制区域内&#x…

​虚幻引擎UE5渲染不够快的解决办法

​虚幻引擎是由Epic Games公司开发的一款功能强大、全球最开放且先进的实时 3D 创作工具&#xff0c;广泛应用于游戏、影视、建筑可视化、虚拟现实等多个领域&#xff01;虚幻引擎UE5如何实现在网上极速渲染呢&#xff1f;本文提供云渲染和云电脑两套方案用于渲染提速&#xff…

算力股开盘大涨,电光科技7连板

12 月 30 日&#xff0c;尽管北证 50 指数半日跌超 3% 再创调整新低&#xff0c;全市场超 4200 股飘绿&#xff0c;但算力概念股却逆势活跃&#xff0c;电光科技实现 7 连板。以下是对这一现象的具体分析&#xff1a; 原因分析 政策利好&#xff1a;上海近日印发《关于人工智能…

kanzi做3d时钟屏保

用kanzi做一个3d屏保 1. blender制作3d数字模型 下载一些好看的字体文件&#xff0c;用blender建模字体模型&#xff0c;导出fbx格式 2. 新建kanzi工程 导入fbx模型&#xff0c;创建节点&#xff0c;时分秒节点&#xff0c;最上面放一个按钮&#xff0c;用来点击 根据喜好…

logback之自定义pattern使用的转换器

目录 &#xff08;1&#xff09;场景介绍 &#xff08;2&#xff09;定义转换器BizCallerConverter &#xff08;3&#xff09;logback配置conversionRule &#xff08;4&#xff09;测试效果 前文《logback之pattern详解以及源码分析》已经介绍了pattern&#xff0c;以及…

QTDemo:串口调试工具

项目简介 本项目通过QT框架设计一款可以在Windows、Linux等平台的跨平台串口助手&#xff0c;串口功能能够满足基本的调试需求。 本项目采用的版本为&#xff1a;QT5.14 visual studio 2022 进行开发。 项目源码&#xff1a;https://github.com/say-Hai/MyCOMDemo 项目页面&am…

Selenium+Java(21):Jenkins发送邮件报错Not sent to the following valid addresses解决方案

问题现象 小月妹妹近期在做RobotFrameWork自动化测试,并且使用Jenkins发送测试邮件的时候,发现报错Not sent to the following valid addresses,明明各个配置项看起来都没有问题,但是一到邮件发送环节,就是发送不出去,而且还不提示太多有用的信息,急的妹妹脸都红了,于…

AI 智能助手对话系统

一个基于 React 和 Tailwind CSS 构建的现代化 AI 对话系统&#xff0c;提供流畅的用户体验和丰富的交互功能。 项目链接&#xff1a;即将开放… 功能特点 &#x1f916; 智能对话&#xff1a;支持与 AI 助手实时对话&#xff0c;流式输出回答&#x1f4c1; 文件处理&#xff…

Design Compiler:两种工作模式(线负载模式和拓扑模式)

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 Design Compiler可以以线负载模式或拓扑模式启动&#xff0c;必须选择其中一个模式。在拓扑模式下还可使用多模式和UPF模式&#xff1a;多模式允许在多种工作…

应急响应练习

文章目录 web1web2 web1 题目要求&#xff1a; 前景需要&#xff1a; 小李在值守的过程中&#xff0c;发现有CPU占用飙升&#xff0c;出于胆子小&#xff0c;就立刻将服务器关机&#xff0c;这是他的服务器系统&#xff0c;请你找出以下内容&#xff0c;并作为通关条件&#…

从零开始构建直播APP美颜功能:直播美颜SDK的开发实践指南

本文将从零开始&#xff0c;详细探讨如何开发一款功能完善的直播美颜SDK&#xff0c;帮助开发者快速集成美颜功能。 一、明确需求与功能设计 开发美颜功能的第一步是明确需求。直播场景中的美颜需求通常包括以下几点&#xff1a; 实时滤镜&#xff1a;提供多种风格的滤镜&am…

.NET周刊【12月第4期 2024-12-22】

国内文章 dotnet 简单使用 ICU 库进行分词和分行 https://www.cnblogs.com/lindexi/p/18622917 本文将和大家介绍如何使用 ICU 库进行文本的分词和分行。 dotnet 简单聊聊 Skia 里的 SKFontMetrics 的各项属性作用 https://www.cnblogs.com/lindexi/p/18621674 本文将和大…

vue3大屏实现;使用使用CSS Grid实现大屏

文章目录 一、效果1.效果2.使用CSS Grid3.插件4.html代码5.index.scss代码 一、效果 1.效果 方案&#xff1a;采用CSS的Grid布局&#xff0c;实现首页大屏模块划分和自适应功能&#xff1b; 布局&#xff1a; 大屏主要内容&#xff0c;高宽比是1920*1080&#xff1b;即16:9的…

基于FISCO BCOS的电子签署系统

概述 本项目致力于构建一个安全、高效且功能完备的电子签署系统&#xff0c;通过整合区块链技术与传统数据库管理&#xff0c;为用户提供了可靠的电子签署解决方案&#xff0c;有效应对传统电子签署系统的数据安全隐患&#xff0c;满足企业和个人在数字化办公环境下对电子文档…