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