栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

QComboBox自定义下拉表格

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

QComboBox自定义下拉表格

文章目录
  • 前言
  • 一、自定义数据模型
  • 二、使用步骤
    • 1.初始化模型和视图
    • 2.视图属性设置
    • 3.设置comboBox
    • 4.演示
  • 总结


前言


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

一、自定义数据模型

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

#ifndef QTABLEITEMMODEL_H
#define QTABLEITEMMODEL_H

#include 
#include 
#include 
#include 
#include 
#include 

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/629383.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号