posts - 10,comments - 1,views - 23579

新建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);
}
复制代码

 

posted on   青春凹陷  阅读(1052)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示