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