前言
提示:由于实际项目中有这个需要,应此记录一下。
一、自定义数据模型
考虑到我们需要使用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定制下拉表格的使用,本文只是简单的做一个演示,对于实际项目需要,可以自定义表格样式,数据模型等。博主这边也是做个记录,如有错误,欢迎指正,共同学习。