最终效果:
实现思路:如果只用一个表格的话写起来比较麻烦,可以考虑使用两个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;
}
此方法写出来的表头自带冻结效果