其实这个qt官方已经有例子,感兴趣的可以参考下
样例
我这个是根据qt官方例子改良之后的。这个都可以根据自己不同需要来定制。
.h
#ifndef EP_TABLEVIEW_H
#define EP_TABLEVIEW_H
#include <QWidget>
#include <QTableView>
class EP_TableView : public QTableView
{
Q_OBJECT
public:
explicit EP_TableView(QWidget *parent = nullptr);
~EP_TableView();
void SetModel(QAbstractItemModel *model);
protected:
void resizeEvent(QResizeEvent *event) override;
QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override;
private:
QTableView *frozenTableView=nullptr;
void init();
void updateFrozenTableGeometry();
private slots:
void updateSectionWidth(int logicalIndex, int oldSize, int newSize);
void updateSectionHeight(int logicalIndex, int oldSize, int newSize);
};
#endif // EP_TABLEVIEW_H
.cpp
#include "ep_tableview.h"
#include <QHeaderView>
#include <QScrollBar>
#include <QAbstractSlider>
#include <qdebug.h>
#include "mainwindow.h"
#include "AppEvent.h"
EP_TableView::EP_TableView(QWidget *parent) : QTableView(parent)
{
frozenTableView = new QTableView(this);
init();
this->setFocus();
//connect the headers and scrollbars of both tableviews together
//
connect(horizontalHeader(),&QHeaderView::sectionResized, this,
&EP_TableView::updateSectionWidth);
connect(verticalHeader(),&QHeaderView::sectionResized, this,
&EP_TableView::updateSectionHeight);
connect(frozenTableView->verticalScrollBar(), &QScrollBar::valueChanged,
this->verticalScrollBar(), &QScrollBar::setValue);
/*connect(verticalScrollBar(), &QAbstractSlider::valueChanged,
frozenTableView->verticalScrollBar(), &QAbstractSlider::setValue);*/
connect(AppEvent::getInstance(), &AppEvent::sSendVecScrollBarValueChange,
frozenTableView->verticalScrollBar(), &QAbstractSlider::setValue);
}
EP_TableView::~EP_TableView()
{
}
void EP_TableView::SetModel(QAbstractItemModel *qmodel)
{
this->setModel(qmodel);
frozenTableView->setModel(qmodel);
frozenTableView->setSelectionModel(selectionModel());
for (int col = 1; col < model()->columnCount(); ++col)
frozenTableView->setColumnHidden(col, true);
frozenTableView->setColumnWidth(0, columnWidth(0));
}
void EP_TableView::resizeEvent(QResizeEvent *event)
{
QTableView::resizeEvent(event);
updateFrozenTableGeometry();
}
QModelIndex EP_TableView::moveCursor(QAbstractItemView::CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
{
QModelIndex current = QTableView::moveCursor(cursorAction, modifiers);
if (cursorAction == MoveLeft && current.column() > 0
&& visualRect(current).topLeft().x() < frozenTableView->columnWidth(0) ){
const int newValue = horizontalScrollBar()->value() + visualRect(current).topLeft().x()
- frozenTableView->columnWidth(0);
horizontalScrollBar()->setValue(newValue);
}
return current;
}
void EP_TableView::init()
{
QFont TextFont;
TextFont.setPointSize(12 * MainWindow::m_Factormeanvalue);
TextFont.setFamily("Arial");
frozenTableView->setFocusPolicy(Qt::NoFocus);
frozenTableView->verticalHeader()->hide();
frozenTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
frozenTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
viewport()->stackUnder(frozenTableView);
frozenTableView->horizontalHeader()->setStyleSheet("QHeaderView::section {background-color:qlineargradient(x1:0, y1:0, x2:0, y2:1,\
stop:0 rgba(69,133,245,38), stop: 0.5 rgba(69,133,245,38),stop: 0.6 rgba(69,133,245,38), stop:1 rgba(69,133,245,38));color: black;border:1px solid rgba(69,133,245,38)}"); //border:1px solid rgba(153,153,153,51)
frozenTableView->horizontalHeader()->setFixedHeight(44 * MainWindow::m_Factory);
frozenTableView->setStyleSheet("border:1px solid rgba(153,153,153,51)");
frozenTableView->setStyleSheet("QTableCornerButton::section{ background:white; }"
"QTableView::item:selected { background-color: rgb(69,133,254) }"
"QTableView{alternate-background-color:rgba(69,133,245,38);background:white}");
frozenTableView->setFont(TextFont);
frozenTableView->horizontalHeader()->setFont(TextFont);
frozenTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
frozenTableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
frozenTableView->show();
frozenTableView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(frozenTableView, &QTableView::customContextMenuRequested, this, &EP_TableView::customContextMenuRequested);
updateFrozenTableGeometry();
setHorizontalScrollMode(ScrollPerPixel);
setVerticalScrollMode(ScrollPerPixel);
frozenTableView->setVerticalScrollMode(ScrollPerPixel);
}
void EP_TableView::updateFrozenTableGeometry()
{
frozenTableView->setGeometry(verticalHeader()->width() + frameWidth(),
frameWidth(), columnWidth(0),
viewport()->height()+horizontalHeader()->height());
}
void EP_TableView::updateSectionWidth(int logicalIndex, int oldSize, int newSize)
{
if (logicalIndex == 0){
frozenTableView->setColumnWidth(0, newSize);
updateFrozenTableGeometry();
}
}
void EP_TableView::updateSectionHeight(int logicalIndex, int oldSize, int newSize)
{
frozenTableView->setRowHeight(logicalIndex, newSize);
}
效果图: