QTableWidget实现多级表头、表头冻结效果

发布于:2025-05-11 ⋅ 阅读:(16) ⋅ 点赞:(0)

最终效果:
在这里插入图片描述
实现思路:如果只用一个表格的话写起来比较麻烦,可以考虑使用两个QTableWidget组合,把复杂的表头一个用QTableWidget显示,其他内容用另一个QTableWidget。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTableWidget>
#include <QLayout>
#include <QHeaderView>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    resize(1120, 720);
    QWidget* widget = new QWidget(this);
    QTableWidget* head = new QTableWidget;
    QTableWidget* content = new QTableWidget;
    setCentralWidget(widget);
    QVBoxLayout* vLayout = new QVBoxLayout(widget);
    vLayout->setSpacing(0);
    vLayout->setMargin(0);
    widget->setLayout(vLayout);

    head->setFixedHeight(80);
    head->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    //取消表头
    head->horizontalHeader()->setVisible(false);
    head->verticalHeader()->setVisible(false);
    //取消滚动条
    head->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    head->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    //不接受绘制
    head->setFrameShape(QFrame::NoFrame);
    //不接受焦点
    head->setFocusPolicy(Qt::NoFocus);
    //不可编辑
    head->setEditTriggers(QAbstractItemView::NoEditTriggers);
    //不可选择
    head->setSelectionMode(QAbstractItemView::NoSelection);
    head->setRowCount(2);
    head->setColumnCount(9);
    head->setSpan(0, 0, 2, 1);
    head->setItem(0, 0, new QTableWidgetItem(QString("时间")));

    head->setSpan(0, 1, 1, 2);
    head->setItem(0, 1, new QTableWidgetItem(QString("管理区1")));
    head->setItem(1, 1, new QTableWidgetItem(QString("应到")));
    head->setItem(1, 2, new QTableWidgetItem(QString("实到")));

    head->setSpan(0, 3, 1, 2);
    head->setItem(0, 3, new QTableWidgetItem(QString("管理区2")));
    head->setItem(1, 3, new QTableWidgetItem(QString("应到")));
    head->setItem(1, 4, new QTableWidgetItem(QString("实到")));

    head->setSpan(0, 5, 1, 2);
    head->setItem(0, 5, new QTableWidgetItem(QString("管理区3")));
    head->setItem(1, 5, new QTableWidgetItem(QString("应到")));
    head->setItem(1, 6, new QTableWidgetItem(QString("实到")));

    head->setSpan(0, 7, 1, 2);
    head->setItem(0, 7, new QTableWidgetItem(QString("管理区4")));
    head->setItem(1, 7, new QTableWidgetItem(QString("应到")));
    head->setItem(1, 8, new QTableWidgetItem(QString("实到")));
    for(int i = 0; i < head->rowCount(); i++){
        for(int j = 0; j < head->columnCount(); j++){
            if(!head->item(i, j))continue;
            head->item(i, j)->setTextAlignment(Qt::AlignCenter);
        }
    }
    head->setRowHeight(0, 40);
    head->setRowHeight(1, 40);

    content->horizontalHeader()->setVisible(false);
    content->verticalHeader()->setVisible(false);
    content->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    content->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    content->setFrameShape(QFrame::NoFrame);
    content->setFocusPolicy(Qt::NoFocus);
    content->setEditTriggers(QAbstractItemView::NoEditTriggers);
    content->setSelectionMode(QAbstractItemView::NoSelection);
    content->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    content->setRowCount(27);
    content->setColumnCount(9);
    content->setItem(0, 0, new QTableWidgetItem(QString("0-1")));
    content->setItem(1, 0, new QTableWidgetItem(QString("1-2")));
    content->setItem(2, 0, new QTableWidgetItem(QString("2-3")));
    content->setItem(3, 0, new QTableWidgetItem(QString("3-4")));
    content->setItem(4, 0, new QTableWidgetItem(QString("4-5")));
    content->setItem(5, 0, new QTableWidgetItem(QString("5-6")));
    content->setItem(6, 0, new QTableWidgetItem(QString("6-7")));
    content->setItem(7, 0, new QTableWidgetItem(QString("7-8")));
    content->setItem(8, 0, new QTableWidgetItem(QString("8-9")));
    content->setItem(9, 0, new QTableWidgetItem(QString("9-10")));
    content->setItem(10, 0, new QTableWidgetItem(QString("10-11")));
    content->setItem(11, 0, new QTableWidgetItem(QString("11-12")));
    content->setItem(12, 0, new QTableWidgetItem(QString("12-13")));
    content->setItem(13, 0, new QTableWidgetItem(QString("13-14")));
    content->setItem(14, 0, new QTableWidgetItem(QString("14-15")));
    content->setItem(15, 0, new QTableWidgetItem(QString("15-16")));
    content->setItem(16, 0, new QTableWidgetItem(QString("16-17")));
    content->setItem(17, 0, new QTableWidgetItem(QString("17-18")));
    content->setItem(18, 0, new QTableWidgetItem(QString("18-19")));
    content->setItem(19, 0, new QTableWidgetItem(QString("19-20")));
    content->setItem(20, 0, new QTableWidgetItem(QString("20-21")));
    content->setItem(21, 0, new QTableWidgetItem(QString("21-22")));
    content->setItem(22, 0, new QTableWidgetItem(QString("22-23")));
    content->setItem(23, 0, new QTableWidgetItem(QString("23-24")));
    content->setItem(24, 0, new QTableWidgetItem(QString("最大值")));
    content->setItem(25, 0, new QTableWidgetItem(QString("最小值")));
    content->setItem(26, 0, new QTableWidgetItem(QString("平均值")));
    for(int i = 0; i < content->rowCount(); i++){
        for(int j = 0; j < content->columnCount(); j++){
            if(!content->item(i, j))continue;
            content->item(i, j)->setTextAlignment(Qt::AlignCenter);
        }
    }

    vLayout->addWidget(head);
    vLayout->addWidget(content);
}

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

此方法写出来的表头自带冻结效果
请添加图片描述


网站公告

今日签到

点亮在社区的每一天
去签到