QComboBox自定义下拉表格


前言


提示:由于实际项目中有这个需要,应此记录一下。

一、自定义数据模型

考虑到我们需要使用QComboBox显示表格模型,当然列表也可以,此处我选择的是QAbstractTableModel,基于QAbstractItemModel,并且QT本身做了部分默认实现,下面我们就重写我们自己的数据实现,直接上代码:

#ifndef QTABLEITEMMODEL_H
#define QTABLEITEMMODEL_H

#include <QObject>
#include <QAbstractTableModel>
#include <QDebug>
#include <QColor>
#include <QFont>
#include <QIcon>

#define ROW_OF_TABLE 5
#define COLUMN_OF_TABLE 6
class QTableItemModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit QTableItemModel(QObject *parent = nullptr);

    QVariant data(const QModelIndex &index, int role) const;
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
private:
    QStringList m_provinceList;
};

#endif // QTABLEITEMMODEL_H

首先data()函数是必须重新实现的,提供数据,此外rowcount()和columnCount()也是要重新实现的,我这边就直接宏定义了,当然你也可以自定义一个公共接口,用的时候外部传进来。

#include "qtableitemmodel.h"

QTableItemModel::QTableItemModel(QObject *parent) : QAbstractTableModel(parent)
{
    for(int i=0;i<30;++i){
        m_provinceList.append(QString::number(i));
    }
}

QVariant QTableItemModel::data(const QModelIndex &index, int role) const
{
    //Q_UNUSED(role);
    if(role==Qt::DisplayRole)
    {
        int row=index.row();
        int col=index.column();
        return m_provinceList.at(row*6+col);

    }else if(role==Qt::FontRole){
        return QFont("微软雅黑",15);
    }else if(role==Qt::DecorationRole){
        return QIcon(":/style/computer.ico");
    }
    else if (role == Qt::TextAlignmentRole){
        return int(Qt::AlignHCenter | Qt::AlignVCenter);
    }
    else if(role == Qt::TextColorRole){
        return QColor(255,0,0);
    }
    return QVariant();
}
//rowCount和columnCount必须重写
int QTableItemModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return ROW_OF_TABLE;
}

int QTableItemModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return COLUMN_OF_TABLE;
}

QVariant QTableItemModel::headerData(int section, Qt::Orientation orientation, int role) const
{

    return QVariant();
}

具体的数据,你可以设置,我这里就随便初始化一个字符列表代替了

二、使用步骤

1.初始化模型和视图

    m_model = new QTableItemModel();
    QTableView *view = new QTableView(this);

2.视图属性设置

代码如下(示例):

    view->setMinimumHeight(200);
    view->horizontalHeader()->setVisible(false);
    view->verticalHeader()->setVisible(false);
    view->setAlternatingRowColors(true);

3.设置comboBox

这里给combobox设置自定义的模型和视图,注意setModelColumn一定要设置,否则下拉后,点击选中的item,都只会显示第一列的数据,被坑了。。

    ui->comboBox->setModelColumn(6);
    ui->comboBox->setModel(m_model);
    ui->comboBox->setView(view);

这里没什么说的,设置下最小高度,以及header均不可见,如果你需要设置行和列表头,需要重写下面两个函数:


virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const

virtual Qt::ItemFlags flags(const QModelIndex &index) const

4.演示

在这里插入图片描述


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了QComboBox定制下拉表格的使用,本文只是简单的做一个演示,对于实际项目需要,可以自定义表格样式,数据模型等。博主这边也是做个记录,如有错误,欢迎指正,共同学习。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在PyQt5,可以通过自定义QComboBox下拉列表表格。具体步骤如下: 1. 创建一个QComboBox实例,并将其设置为自定义表格下拉列表。 2. 创建一个QAbstractItemModel实例,并实现其方法以提供表格数据。 3. 创建一个QTableView实例,并将其设置为QComboBox下拉列表视图。 4. 将QTableView设置为下拉列表的大小,并将其附加到QComboBox下拉列表。 下面是一个简单示例代码: ```python import sys from PyQt5.QtWidgets import QApplication, QComboBox, QTableView, QAbstractItemModel, QVBoxLayout, QWidget class TableModel(QAbstractItemModel): def __init__(self, data): super(TableModel, self).__init__() self.data = data def rowCount(self, parent): return len(self.data) def columnCount(self, parent): return len(self.data[0]) def data(self, index, role): if role == Qt.DisplayRole: return self.data[index.row()][index.column()] def index(self, row, column, parent): return self.createIndex(row, column) def parent(self, index): return QModelIndex() if __name__ == '__main__': app = QApplication(sys.argv) widget = QWidget() combo_box = QComboBox() data = [ [1, "Apple"], [2, "Banana"], [3, "Orange"], ] model = TableModel(data) table_view = QTableView() table_view.setModel(model) combo_box.setView(table_view) layout = QVBoxLayout(widget) layout.addWidget(combo_box) widget.setLayout(layout) widget.show() sys.exit(app.exec_()) ``` 在上述代码,通过自定义TableModel类,我们可以提供表格的数据。然后,我们将这个TableModel实例应用到QTableView,利用QTableView来实现下拉列表表格视图。 最后,我们将QTableView设置为QComboBox下拉列表视图。在表格视图,我们可以显示相应的表格数据。 这样,我们就可以在PyQt5自定义QComboBox下拉列表表格
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值