新建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); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix