新建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); }