使用两个QTableWidget实现复杂表头(可直接运行 )
1、运行界面
demo.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_demo02.h"
class demo02 : public QWidget
{
Q_OBJECT
public:
demo02(QWidget *parent = Q_NULLPTR);
~demo02();
private slots:
void onSliderMoved(int);
public:
void initAllTableWidget();
private:
Ui::demo02Class *ui;
};
demo.cpp
#include "demo02.h"
#include <QStringList>
//----------------------------------------------------------------
demo02::demo02(QWidget *parent)
: QWidget(parent)
{
ui = new Ui::demo02Class();
ui->setupUi(this);
initAllTableWidget();
}
//----------------------------------------------------------------
demo02::~demo02()
{
}
//----------------------------------------------------------------
void demo02::initAllTableWidget()
{
ui->table_header->horizontalHeader()->setVisible(false);
ui->table_header->verticalHeader()->setVisible(false);
ui->table_header->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->table_header->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->table_header->setFrameShape(QFrame::NoFrame);
ui->table_header->setFocusPolicy(Qt::NoFocus);
ui->table_header->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->table_header->setSelectionMode(QAbstractItemView::NoSelection);
ui->table_header->setRowCount(2);
ui->table_header->setColumnCount(9);
ui->table_header->setFixedHeight(ui->table_header->rowHeight(0) + ui->table_header->rowHeight(1));
ui->table_header->setSpan(0, 0, 2, 1);
ui->table_header->setItem(0, 0, new QTableWidgetItem("Order"));
ui->table_header->item(0, 0)->setTextAlignment(Qt::AlignCenter);
ui->table_header->setSpan(0, 1, 1, 2);
ui->table_header->setItem(0, 1, new QTableWidgetItem("Red"));
ui->table_header->item(0, 1)->setTextAlignment(Qt::AlignCenter);
ui->table_header->setItem(1, 1, new QTableWidgetItem("x"));
ui->table_header->item(1, 1)->setTextAlignment(Qt::AlignCenter);
ui->table_header->setItem(1, 2, new QTableWidgetItem("y"));
ui->table_header->item(1, 2)->setTextAlignment(Qt::AlignCenter);
ui->table_header->setSpan(0, 3, 1, 2);
ui->table_header->setItem(0, 3, new QTableWidgetItem("Green"));
ui->table_header->item(0, 3)->setTextAlignment(Qt::AlignCenter);
ui->table_header->setItem(1, 3, new QTableWidgetItem("x"));
ui->table_header->item(1, 3)->setTextAlignment(Qt::AlignCenter);
ui->table_header->setItem(1, 4, new QTableWidgetItem("y"));
ui->table_header->item(1, 4)->setTextAlignment(Qt::AlignCenter);
ui->table_header->setSpan(0, 5, 1, 2);
ui->table_header->setItem(0, 5, new QTableWidgetItem("NIR"));
ui->table_header->item(0, 5)->setTextAlignment(Qt::AlignCenter);
ui->table_header->setItem(1, 5, new QTableWidgetItem("x"));
ui->table_header->item(1, 5)->setTextAlignment(Qt::AlignCenter);
ui->table_header->setItem(1, 6, new QTableWidgetItem("y"));
ui->table_header->item(1, 6)->setTextAlignment(Qt::AlignCenter);
ui->table_header->setSpan(0, 7, 1, 2);
ui->table_header->setItem(0, 7, new QTableWidgetItem("FIR"));
ui->table_header->item(0, 7)->setTextAlignment(Qt::AlignCenter);
ui->table_header->setItem(1, 7, new QTableWidgetItem("x"));
ui->table_header->item(1, 7)->setTextAlignment(Qt::AlignCenter);
ui->table_header->setItem(1, 8, new QTableWidgetItem("y"));
ui->table_header->item(1, 8)->setTextAlignment(Qt::AlignCenter);
ui->table_content->horizontalHeader()->setVisible(false);
ui->table_content->verticalHeader()->setVisible(false);
//ui->table_content->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->table_content->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->table_content->setFrameShape(QFrame::NoFrame);
ui->table_content->setFocusPolicy(Qt::NoFocus);
ui->table_content->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->table_content->setSelectionMode(QAbstractItemView::SingleSelection);
ui->table_content->setAlternatingRowColors(true);
ui->table_content->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->table_content->setColumnCount(9);
ui->table_content->setRowCount(5);
QStringList list;
list << "8.8-1" << "8.8-3" << "8.8-5" << "8.8-7" << "8.0-1";
for (int i = 0; i < 5; i++)
{
ui->table_content->setItem(i, 0, new QTableWidgetItem(list[i]));
}
//ui->table_header->setHorizontalScrollBar(ui->horizontalScrollBar1);
**//将界面的QScrollBar添加到内容表格**
ui->table_content->setHorizontalScrollBar(ui->horizontalScrollBar1);
connect(ui->horizontalScrollBar1, SIGNAL(valueChanged(int)), this, SLOT(onSliderMoved(int)));
}
//----------------------------------------------------------------
void demo02::onSliderMoved(int pos)
{
ui->table_header->horizontalScrollBar()->setValue(pos);
}
四、分析
1、布局方面建议直接使用QT designer进行布局
2、难点主要在于使用一个QScrollBar控制两个表格的移动,首先需要禁用表头(ui->table_header)的滚动条,之后将自定义的QScrollBar添加到内容表格(ui->table_content)。进行信号槽链接。由于是用水平滚动条,所以内容表格的水平滚动条不能设为禁止使用。