Qt重写QComboBox实现下拉展示多列数据

 更新时间:2024年11月30日 11:35:17   作者:Lydro  
这篇文章主要为大家详细介绍了Qt如何重写QComboBox实现下拉展示多列数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

需求

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

实现

直接上代码:

#include <QComboBox>
#include <QTableWidget>
#include <QVBoxLayout>
#include <QWidget>
#include <QEvent>
#include <QMouseEvent>
#include <QLineEdit>
class ComboBoxWithTableWidget : public QComboBox {
    Q_OBJECT
 
public:
    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;
};

示例效果

到此这篇关于Qt重写QComboBox实现下拉展示多列数据的文章就介绍到这了,更多相关Qt QComboBox下拉展示多列数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Qt实现文本文件的读写操作

    使用Qt实现文本文件的读写操作

    在现代应用程序开发中,文件操作是一个不可或缺的任务,无论是读取配置文件、处理用户输入,还是保存日志信息,文件的读取和写入操作都非常重要,本文我们将展示如何通过一个简单的图形用户界面(GUI),利用QFile、QTextStream和QFileDialog类来高效地进行文件操作
    2024-06-06
  • 详解C++ 内存对齐

    详解C++ 内存对齐

    这篇文章主要介绍了C++ 内存对齐的相关资料,帮助大家更好的理解和使用c++编程语言,感兴趣的朋友可以了解下
    2021-01-01
  • C++中内存池和内存分配区Arena概念详解

    C++中内存池和内存分配区Arena概念详解

    在 C++ 中,内存分配区(Arena)通常指的是预先分配的一大块连续内存空间,这种方法的主要目的是提高内存分配和释放的效率,下面就跟随小编一起了解一下C++中内存池和内存分配区Arena相关概念吧
    2023-12-12
  • C语言中的const如何保证变量不被修改

    C语言中的const如何保证变量不被修改

    这篇文章主要给大家介绍了关于C语言中const如何保证变量不被修改的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 浅析iterator与指针的区别

    浅析iterator与指针的区别

    指针和iterator都支持减法运算,指针-指针得到的是两个指针之间的距离,迭代器-迭代器得到的是两个迭代器之间的距离
    2013-10-10
  • C++哈希应用的位图和布隆过滤器

    C++哈希应用的位图和布隆过滤器

    这篇文章主要介绍了C++哈希应用的位图和布隆过滤器的相关资料,文章内容多以列举试题的方式讲解,感兴趣的朋友可以参考下面文章内容
    2021-09-09
  • C++简单实现Dijkstra算法

    C++简单实现Dijkstra算法

    这篇文章主要为大家详细介绍了C++简单实现Dijkstra算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 关于STL中set容器的一些总结

    关于STL中set容器的一些总结

    关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序
    2013-09-09
  • C语言实现停车场管理

    C语言实现停车场管理

    这篇文章主要为大家详细介绍了C语言课程设计之停车场管理问题,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C/C++ Socket设置接收超时时间的多种方法

    C/C++ Socket设置接收超时时间的多种方法

    网络编程中经常需要处理的一个问题就是如何正确地处理Socket超时,对于C/C++,有几种常用的技术可以用来设置Socket接收超时时间,在这篇文章中,我们将详细介绍如何在C/C++中设置Socket的非阻塞模式以及如何配置接收超时时间,需要的朋友可以参考下
    2024-01-01

最新评论