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

【Qt】重写QComboBox下拉展示多列数据

需求

点击QComboBox时,下拉列表以多行多列的表格展示出来。

实现

直接上代码:

#include <QComboBox>
#include <QTableWidget>
#include <QVBoxLayout>
#include <QWidget>
#include <QEvent>
#include <QMouseEvent>
#include <QLineEdit>
class ComboBoxWithTableWidget : public QComboBox {Q_OBJECTpublic:ComboBoxWithTableWidget(QWidget *parent = nullptr) : QComboBox(parent) {// 隐藏默认的下拉箭头setEditable(true);lineEdit()->setReadOnly(true);// 创建一个隐藏的容器来存放我们的表格popupWidget = new QWidget(this);popupWidget->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint);QVBoxLayout *layout = new QVBoxLayout(popupWidget);layout->setContentsMargins(0, 0, 0, 0);layout->setSpacing(0);tableWidget = new QTableWidget(5, 2, popupWidget); // 5行2列for (int row = 0; row < 5; ++row){for (int col = 0; col < 2; ++col){QTableWidgetItem *item = new QTableWidgetItem(QString("Item %1%2").arg(row).arg(col));tableWidget->setItem(row, col, item);}}tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);layout->addWidget(tableWidget);popupWidget->resize(220,200);connect(tableWidget, &QTableWidget::cellClicked, this, &ComboBoxWithTableWidget::onCellClicked);popupWidget->hide();}protected:void showPopup() override{if (popupWidget->isHidden()){QComboBox::showPopup();//popupWidget->resize(this->width(), tableWidget->height() + 2); //(可能需要调整)popupWidget->move(this->mapToGlobal(QPoint(0, this->height())));popupWidget->show();tableWidget->setFocus();}}void hidePopup() override{if (popupWidget->isVisible()){popupWidget->hide();QComboBox::hidePopup();}}private slots:void onCellClicked(int row, int column){QString text = tableWidget->item(row, column)->text();this->setCurrentText(text);hidePopup(); // 选择后隐藏下拉列表}private:QWidget *popupWidget = nullptr;QTableWidget *tableWidget= nullptr;
};

示例效果

http://www.lryc.cn/news/493016.html

相关文章:

  • 【mac】终端左边太长处理,自定义显示名称(terminal路径显示特别长)
  • 基于Springboot的流浪宠物管理系统
  • web博客系统的自动化测试
  • 【论文阅读】Multi-level Semantic Feature Augmentation for One-shot Learning
  • 网络知识面试
  • 图片预览 图片上传到服务器
  • 前端:base64的作用
  • Django在fitler过滤不等于的条件
  • Spring Boot英语知识分享网站:技术与实践
  • 京准电钟:NTP网络校时服务器从入门到精准
  • C++趣味编程玩转物联网:用树莓派Pico控制四位数码管
  • DRM(数字权限管理技术)防截屏录屏----视频转hls流加密、web解密播放
  • 实验三 z变换及离散时间LTI系统的z域分析
  • Python中的DrissionPage详解
  • python除了熟悉的pandas,openpyxl库也很方便的支持编辑Excel表
  • go语言怎么实现bash cmd里的mv功能?
  • Vue前端面试进阶(五)
  • 面试手撕题积累
  • notepad++文件github下载
  • .NET新知识点笔记
  • 数据结构:链表进阶
  • Python 爬虫入门教程:从零构建你的第一个网络爬虫
  • Java面试题、八股文——JVM篇最终篇
  • Spring Boot整合Redis Stack构建本地向量数据库相似性查询
  • shell脚本基础学习_总结篇(完结)
  • 什么是 C++ 中的函数对象?它有什么特点?
  • css:项目
  • macOS 开发环境配置与应用开发指南
  • [A-19][V06]ARMv8/v9-内存虚拟化原理
  • registry 删除私有仓库镜像