Qt重寫(xiě)QComboBox實(shí)現(xiàn)下拉展示多列數(shù)據(jù)
需求
點(diǎn)擊QComboBox時(shí),下拉列表以多行多列的表格展示出來(lái)。
實(shí)現(xiàn)
直接上代碼:
#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) {
// 隱藏默認(rèn)的下拉箭頭
setEditable(true);
lineEdit()->setReadOnly(true);
// 創(chuàng)建一個(gè)隱藏的容器來(lái)存放我們的表格
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); //(可能需要調(diào)整)
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;
};示例效果

到此這篇關(guān)于Qt重寫(xiě)QComboBox實(shí)現(xiàn)下拉展示多列數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Qt QComboBox下拉展示多列數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Qt實(shí)現(xiàn)文本文件的讀寫(xiě)操作
在現(xiàn)代應(yīng)用程序開(kāi)發(fā)中,文件操作是一個(gè)不可或缺的任務(wù),無(wú)論是讀取配置文件、處理用戶輸入,還是保存日志信息,文件的讀取和寫(xiě)入操作都非常重要,本文我們將展示如何通過(guò)一個(gè)簡(jiǎn)單的圖形用戶界面(GUI),利用QFile、QTextStream和QFileDialog類來(lái)高效地進(jìn)行文件操作2024-06-06
C++中內(nèi)存池和內(nèi)存分配區(qū)Arena概念詳解
在 C++ 中,內(nèi)存分配區(qū)(Arena)通常指的是預(yù)先分配的一大塊連續(xù)內(nèi)存空間,這種方法的主要目的是提高內(nèi)存分配和釋放的效率,下面就跟隨小編一起了解一下C++中內(nèi)存池和內(nèi)存分配區(qū)Arena相關(guān)概念吧2023-12-12
C++簡(jiǎn)單實(shí)現(xiàn)Dijkstra算法
這篇文章主要為大家詳細(xì)介紹了C++簡(jiǎn)單實(shí)現(xiàn)Dijkstra算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
C語(yǔ)言實(shí)現(xiàn)停車(chē)場(chǎng)管理
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言課程設(shè)計(jì)之停車(chē)場(chǎng)管理問(wèn)題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
C/C++ Socket設(shè)置接收超時(shí)時(shí)間的多種方法
網(wǎng)絡(luò)編程中經(jīng)常需要處理的一個(gè)問(wèn)題就是如何正確地處理Socket超時(shí),對(duì)于C/C++,有幾種常用的技術(shù)可以用來(lái)設(shè)置Socket接收超時(shí)時(shí)間,在這篇文章中,我們將詳細(xì)介紹如何在C/C++中設(shè)置Socket的非阻塞模式以及如何配置接收超時(shí)時(shí)間,需要的朋友可以參考下2024-01-01

