QTableWidget自动填充表格且自由调整宽度


新建MyTableWidget类继承自QTableWidget重写paintEvent方法即可,paintEvent方法中根据窗口宽度动态调整每列宽度即可,具体代码如下:

#pragma once

#include <QTableWidget>

class MyTableWidget : public QTableWidget
{
    Q_OBJECT

public:
    MyTableWidget(QWidget *parent);
    ~MyTableWidget();
    //sizes:每列所占宽度,特殊列(用户动态调整列宽时使用)
    void setWidth(const QVector<int>& sizes,int specialColumn);
protected:
    void paintEvent(QPaintEvent *event) override;
private:
    //每列所占比例
    QVector<int> mSizes;
    //历史宽度
    QVector<int> mOldSizes;
    //列总数
    int mColumnCount;
    //特殊列宽
    int mSpecialColumn;
    //当前表格宽度
    int mWidth;
};

 

#include "MyTableWidget.h"
#include <QHeaderView>

MyTableWidget::MyTableWidget(QWidget *parent)
    : QTableWidget(parent),mWidth(0),mColumnCount(0)
{
    //取消水平滚动条
    this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
}

MyTableWidget::~MyTableWidget()
{
}

void MyTableWidget::setWidth(const QVector<int>& sizes, int specialColumn)
{
    //设置特殊列不可拖动
    this->horizontalHeader()->setSectionResizeMode(specialColumn, QHeaderView::Fixed);
    mColumnCount = 0;
    for (int index = 0;index < sizes.size();index++)
    {
        mColumnCount += sizes.at(index);
    }
    mSizes = sizes;
    mOldSizes = sizes;
    mSpecialColumn = specialColumn;
}

void MyTableWidget::paintEvent(QPaintEvent *event)
{
    if (!mSizes.isEmpty() && this->columnCount() == mSizes.size() && mSizes.size() > mSpecialColumn)
    {
        if (mWidth == this->width() - 2)
        {
            //动态调整宽度
            int width = mWidth;
            for (int index = 0; index < mOldSizes.size(); index++)
            {
                mOldSizes.replace(index, this->columnWidth(index));
                width -= this->columnWidth(index);
            }
            //mSpecialColumn最小为15像素
            if (width > 0 || (mOldSizes.at(mSpecialColumn) + width > 15))
            {
                this->setColumnWidth(mSpecialColumn, mOldSizes.at(mSpecialColumn) + width);
                mOldSizes.replace(mSpecialColumn, mOldSizes.at(mSpecialColumn) + width);
            }
        }else {
            //调整个Table宽度
            mWidth = this->width() - 2;
            //如果mSizes非空则自适应调整表格宽度
            int width = mWidth;
            //每一份宽度
            int col = width / mColumnCount;
            for (int index = 0; index < mSizes.size(); index++)
            {
                this->setColumnWidth(index, col*(mSizes.at(index)));
                mOldSizes.replace(index, col*(mSizes.at(index)));
                width -= col * (mSizes.at(index));
            }
            this->setColumnWidth(mSpecialColumn, this->columnWidth(mSpecialColumn) + width);
            mOldSizes.replace(mSpecialColumn, this->columnWidth(mSpecialColumn) + width);
        }
    }
    QTableWidget::paintEvent(event);
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM