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下拉展示多列数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c语言动态内存分配知识点及实例

    c语言动态内存分配知识点及实例

    在本篇文章里小编给大家整理的是关于c语言动态内存分配知识点及实例,需要的朋友们可以学习下。
    2020-03-03
  • C++ 单例模式两种实现方式

    C++ 单例模式两种实现方式

    文章介绍了单例模式的两种实现方式:饿汉模式和饱汉模式(懒汉模式),并对比了它们的特性、线程安全、资源占用、启动速度、实现复杂度和性能开销,文章还提供了代码示例和适用场景建议,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • C++中const char*、char const*、char * const三者的区别

    C++中const char*、char const*、char * const三者的区别

    这篇文章主要介绍了C++中const char*、char const*、char * const三者的区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C++设计模式之解释器模式

    C++设计模式之解释器模式

    这篇文章主要介绍了C++设计模式之解释器模式,本文讲解了什么是解释器模式、文法规则和抽象语法树、解释器模式的使用场合等内容,需要的朋友可以参考下
    2014-10-10
  • C++ Opencv实现录制九宫格视频

    C++ Opencv实现录制九宫格视频

    这篇文章主要为大家介绍了如何利用C++和OpenCV库实现录制九宫格视频,文中的示例代码讲解详细,对我们学习OpenCV有一定帮助,感兴趣的可以了解一下
    2022-05-05
  • 五个经典链表OJ题带你进阶C++链表篇

    五个经典链表OJ题带你进阶C++链表篇

    做题之前呢,小编想提醒下大家,要三思而后行,不要一上来就嘎嘎敲代码,要先学会自己画图分析,把自己的思路捋清楚,不要到时候写代码五分钟,调试两小时,记住,编程思路很重要
    2022-03-03
  • C语言的结构体你了解吗

    C语言的结构体你了解吗

    这篇文章主要为大家详细介绍了C语言的结构体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 内核线程优先级设置的方法介绍

    内核线程优先级设置的方法介绍

    本篇文章介绍了,内核线程优先级设置的方法。需要的朋友参考下
    2013-05-05
  • MoveWindow() SetWindowPos()的区别于联系

    MoveWindow() SetWindowPos()的区别于联系

    这篇文章主要介绍了VC++中MoveWindow() SetWindowPos()的区别于联系,需要的朋友可以参考下
    2015-01-01
  • C++实现LeetCode(7.翻转整数)

    C++实现LeetCode(7.翻转整数)

    这篇文章主要介绍了C++实现LeetCode(7.翻转整数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论