qt的qtableview锁定第一列(或者其他列)

其实这个qt官方已经有例子,感兴趣的可以参考下
样例
我这个是根据qt官方例子改良之后的。这个都可以根据自己不同需要来定制。
.h

#ifndef EP_TABLEVIEW_H
#define EP_TABLEVIEW_H#include 
#include 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 
#include 
#include 
#include 
#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);
}

效果图:
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部