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

其实这个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);
}


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

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加油小杜(接qt定制功能,单模块开发等)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值