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