当前位置: 首页 > article >正文

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.kler.cn/a/461578.html

相关文章:

  • 日志聚类算法 Drain 的实践与改良
  • Golang的容器编排实践
  • 数字货币支付系统开发搭建:构建未来的区块链支付生态
  • 库伦值自动化功耗测试工具
  • NSGA-II(非支配排序遗传算法II)详解与实现
  • 网络分析工具-tcpdump
  • 【Domain Generalization(1)】增量学习/在线学习/持续学习/迁移学习/多任务学习/元学习/领域适应/领域泛化概念理解
  • DevOps流程CICD之Jenkins使用操作
  • android知识巩固(二.非线性数据结构)
  • naive ui 安装
  • 2412git,gitdiff与编码
  • SSH 连接远程仓库并推送本地项目
  • mysql带自动递增列的表删除数据后如何重置递增值
  • 【再谈设计模式】策略模式 ~ 算法与行为的灵活调度员
  • L25.【LeetCode笔记】 三步问题的四种解法(含矩阵精彩解法!)
  • 【高阶数据结构】哈希表
  • 【YOLO算法改进】ALSS-YOLO:无人机热红外图像|野生动物小目标检测
  • 前端网络之【浏览器跨域问题分析与解决方案】
  • 在WPS制作的Excel表格中如何快速插入特殊符号,使用Alt快捷简单又高效
  • 每天40分玩转Django:Django即时聊天应用实战
  • VR线上虚拟展厅有哪些技术支撑?
  • html+css网页制作 美食 美食部落6个页面
  • java AQS
  • cocos creator 3.x版本如何添加打开游戏时首屏加载进度条
  • Qt天气预报系统设计界面布局第三部分
  • 爬虫 - 爬取王者荣耀所有皮肤图片