【Qt】QTableView 自定义列头

        QTableView表格控件默认是不支持插入QComboBox、QPushButton、QCheckBox或者是多种复杂控件组成的列头。在实际开发过程中,表格控件通常是需要进行定制化。我们以列头中插入QComboBox为例实现一个简单的自定义列头。

1、实现思路

        用一个QWidget替换掉原列头绘制位置。

2、实现方式

        继承QHeaderView实现自己的表头类CustomHeader,重写paintSection函数。在CustomHeader构造中创建好自己想要的QWidget,在CustomHeader绘制列头区域时用自己的Widget覆盖掉原区域。

CustomHeader::CustomHeader(Qt::Orientation orientation, QWidget *parent)
    : QHeaderView(orientation, parent)
{
    // 创建一个QWidget
    m_pFirstCol = new QWidget((QWidget*)this);

    // 添加布局 
    QHBoxLayout *pLayout = new QHBoxLayout(m_pFirstCol);
    pLayout->setContentsMargins(2, 0, 2, 0);
    pLayout->setSpacing(4);

    // QLabel 用于显示列名
    QLabel *pName = new QLabel(m_pFirstCol);
    pName->setText("第一列");
    pLayout->addWidget(pName);

    // 添加一个下拉框
    QComboBox *pComboBox = new QComboBox(m_pFirstCol);
    pLayout->addWidget(pComboBox);
}

CustomHeader::~CustomHeader()
{

}

void CustomHeader::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
    if (logicalIndex == 0)
    {
        m_pFirstCol->setGeometry(rect); // 第一列特殊处理
    }
    else
    {
        QHeaderView::paintSection(painter, rect, logicalIndex);
    }
}
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initTable();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::initTable()
{
    QStandardItemModel *pModel = new QStandardItemModel(ui->tableView);
    ui->tableView->setModel(pModel);
    
    CustomHeader *pHeader = new CustomHeader(Qt::Orientation::Horizontal, ui->tableView);
    ui->tableView->setHorizontalHeader(pHeader);
    
    QStringList headerList;
    headerList << "第一列" << "第二列" << "第三列";
    pModel->setHorizontalHeaderLabels(headerList);
}
列头带ComboBox效果图

3、结尾 

       通过上述方式我们可以给列头自由添加各种类型的控件,比如QPushButton、QCheckBox等等。

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,QTableView是一种用于显示表格数据的控件,而QAbstractTableModel是QTableView使用的一种数据模型。如果想要在QTableView中展示自定义的数据,需要自定义一个继承自QAbstractTableModel的数据模型。 自定义QAbstractTableModel需要实现以下几个方法: 1. rowCount():返回数据模型中的行数。 2. columnCount():返回数据模型中的列数。 3. data():返回某一项的数据,可以用来在QTableView中展示数据。 4. setData():设置某一项的数据,可以用来在QTableView中编辑数据。 5. headerData():返回行或列的标签,可以用来在QTableView中显示表头。 6. flags():返回某一项的标志,用来指定该项是否可编辑、是否可选中等。 自定义QAbstractTableModel类后,可以将其与QTableView关联,通过setModel()方法来设置数据模型,使QTableView显示自定义的数据。 下面是一个简单的自定义QAbstractTableModel的例子: ```c++ class MyTableModel : public QAbstractTableModel { public: MyTableModel(QObject *parent = nullptr); int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; Qt::ItemFlags flags(const QModelIndex &index) const override; private: QList<QList<QVariant>> m_data; }; ``` 在这个例子中,自定义的数据模型类为MyTableModel,其中实现了rowCount()、columnCount()、data()、setData()、headerData()和flags()方法。m_data变量用于存储数据。自定义的数据模型类可以在需要使用表格数据的地方创建,并通过setModel()方法将其与QTableView关联起来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值