QTableView通过setColumnWidth改变列宽无效的问题解决

QT QSqlQueryModel读取数据库与tableView列宽设置 QSqlQueryModel 提供了一个sql查询结果的只读数据模型。它从查询QSqlQueryModel获取数, 可以方便的用于在QListView, QTableView, QTreeView等各种view上展示数据, 但它是只读的,不能编辑。 第一步:初始化,连接数据库 QSqlDatabase m_db; int m_CurRow; QSqlQueryModel *m_model = nullptr; QItemSelectionModel *m_Sele 阅读详情
AI摘要

本文针对QTableView使用setColumnWidth无法生效的问题,结合Model/View框架原理,提出通过自定义代理类并正确配置表头重调整模式来解决该问题,并指出仅适用于QTableView且需避免与QTableWidget等混淆。

目录

1. 问题的提出

2. 预备知识

3.解决方法

4.注意的问题


1. 问题的提出

       在开发中,需要设置QTableView控件的列宽,但通过QTableView类的setColumnWidth函数设置列宽,发现不起作用。例如下代码不能改变第1列的列宽:

ui->groupGuaraTv->setColumnWidth(0, 400);

其中ui->groupGuaraTv为QTableView类对象。解决方法请参考如下博文:

QTableWidget、QTableView设置行高、列宽不起效果的解决办法

如果上面博文不能解决你的问题,请继续本文的后续章节。

2. 预备知识

        本博文用到了Qt的Model/View/Delegate 框架,如果对Qt的“模型/视图/委托”框架不懂,本博文很难读懂。如果不懂这方面的知识,请在Qt Assistant 中输入Model/View Programming 学习了解。读者本机Qt安装目录下的Examples\Qt-XX.XX.XX\widgets\itemviews目录下有很多model/view framework的例子,可以进行自学了解,其中XX.XX.XX为Qt的版本号,如:5.14.1。

3.解决方法

         先实现一个代理类,代码实现如下:

styleDelegate.cpp

#include "styleDelegate.h"
#include<QPainter>

CStyleDelegate::CStyleDelegate(QObject *parent)
    : QStyledItemDelegate(parent)
{

}

QSize CStyleDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    auto colIndex = index.column();
    auto it = m_mpColumnWidth.find(colIndex);
    if(it == m_mpColumnWidth.end()) // 如果该列不需要设置列宽,就用代理项默认的列宽
    {
        return QStyledItemDelegate::sizeHint(option, index);
    }
    else // 如果该列需要设置列宽,就用设置的列宽
    {
        return QSize(it->second, option.rect.height());
    }
}

void CStyleDelegate::setColumnWidth(int columnIndex, int columnWidth)
{
    m_mpColumnWidth[columnIndex] = columnWidth;
}

styleDelegate.h

#ifndef STYLE_DELEGATE_H
#define STYLE_DELEGATE_H

#include <QStyledItemDelegate>
#include<map>
using std::map;

class CStyleDelegate : public QStyledItemDelegate
{
    Q_OBJECT

public:
    explicit CStyleDelegate(QObject *parent = nullptr);

public:

     /* 改变列宽度。
      * 注意:本函数仅仅对QTableView起作用,
      * 对QTreeView、QTableWidget不起作用(这种情况下,用QTreeView、QTableWidget自己的setColumnWidth函数)
      */
     void setColumnWidth(int columnIndex, int columnWidth);

protected:

    virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
private:
     map<int, int> m_mpColumnWidth; // 需要改变列宽的列索引和该列列宽的map


};

#endif // STYLE_DELEGATE_H

对QTableView对象设置列宽代码如下:

#include"styleDelegate.h"

// 构造一个代理类对象
auto pFaultDelegate = new CStyleDelegate(this);

// 将代理类对象设置到QTableView类ui->myTableView对象上
ui->myTableView->setItemDelegate(pDelegate);

// 设置表格视图水平方向的项尺寸大小重调整模式
ui->myTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeMode::ResizeToContents);

// 改变列宽
pFaultDelegate->setColumnWidth(0, 400);
pFaultDelegate->setColumnWidth(1, 800);


4.注意的问题

  • 一定要调用代理类CStyleDelegate的setColumnWidth函数来改变QTableView的列宽,调用QTableView自身的setColumnWidth函数不会改变列宽。CStyleDelegate的setColumnWidth函数是自己取的名称,为了避免和QTableView自身的setColumnWidth函数混淆,造成误解,你可以将CStyleDelegate的setColumnWidth函数改为其它名称,如:setItemWidth。
  • QTreeView、QTableWidget类也可以用setItemDelegate方法来设置代理,调用它们的setItemDelegate方法来将CStyleDelegate类对象设置为代理,但调用CStyleDelegate的setColumnWidth函数来改变QTreeView、QTableWidget的列宽不会起作用,在这种情况下,用QTreeView、QTableWidget自己的setColumnWidth函数设置列宽能起效果。也就是说2节中提到的方法仅仅对QTableView列宽起作用,对QTreeView、QTableWidget改变列宽不起作用。
  • 一定要将表格视图水平方向的项尺寸大小重调整模式设置为QHeaderView::ResizeMode::ResizeToContents,否则按上面的方法设置列宽不起作用。
QTableView表格视图的列宽设置 Qt中的表格控件可以通过从QTableView或QTableWidget派生子类实现。其中,QTableWidget只是对QTableView的一种简单封装。因为使用QTableView常常需要用户指定自定义的Model,这意味使用起来不够轻便。有时候我们只是想利用一些简单的表格功能,不需要对表格展示有多强大的控制。那么,QTableWidget便是一个不错的选择。这篇博文主要记录表格的列宽和行高... 阅读详情

相关推荐

QTableView列宽设置踩坑记:为什么你的setColumnWidth()不生效?

本文深入解析QTableView列宽设置中setColumnWidth()不生效的常见问题,揭示Qt MVC架构下的视图更新机制。通过对比setColumnWidth和setSectionResizeMode两种方法,提供日志查看器等实际场景的解决方案,并分享响应式布局、性能优化等高级技巧,帮助开发者有效控制表格列宽。

weixin_30564785的博客 344

用SetColumnWidth()函数可以使最后一列的宽度自适应

问题:觉得不是很美观,怎么办? 解决办法:利用SetColumnWidth()函数,第一个参数是最后一列的列号;第二个参数是LVSCW_AUTOSIZE_USEHEADER。  

qq_38344087的博客 2万+

PyQt5中设置QTableWidget列宽大小的几种方式

对于QTableWidget,我们可以通过多种方式来设置列的宽度大小,以满足不同的需求。该方法接受两个参数,第一个参数是列的索引,第二个参数是列的宽度值。根据实际需求,选择适合的方法来设置列宽,以便在表格中显示数据时获得最佳的显示效果。QTableWidget还提供了一个方便的方法resizeColumnsToContents,该方法会自动调整列的宽度,使其适应列中内容的大小。在上述示例中,我们使用horizontalHeader方法获取水平标题栏对象,并通过resizeSection方法设置了列的宽度。

CfProgram的博客 2860

java setcolumnwidth_poi如何设置列宽自适应

sheet.autoSizeColumn(1);sheet.autoSizeColumn(1, true);这两种方式都是自适应列宽度,但是注意这个方法在后边的版本才提供,poi的版本不要太老。 注意:第一个方法在合并单元格的的单元格并不好使,必须用第二个方法。sheet.setColumnWidth(m, “列名”.getBytes().length*2*256);这个方法是计算字符串的长度,以...

weixin_28746457的博客 6808

Unity类银河恶魔城学习记录1-10 PlayerWallJump源代码 P37

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考

Homura_的博客 1379

SAP FICO实操:如何修改已发生业务数据的成本中心公司代码(附RKACOR06程序运行指南)

本文详细解析了SAP FICO系统中使用RKACOR06程序修改已发生业务数据的成本中心和公司代码的实操方法。通过实战案例分享,提供从前期准备到后期验证的全流程指南,帮助企业应对组织架构重组或财务核算体系调整时的数据迁移挑战,特别适用于跨公司代码的成本中心划转场景。

weixin_27303545的博客 190

setColumnWidth 不起作用,QTableWidget的最小默认列宽

QTableWidget setColumnCount 不起作用

weixin_51607549的博客 5420

Visual Studio Installer下载失败的5种修复方法(含DNS修改/补丁安装)

本文针对Visual Studio Installer下载安装文件失败的问题,提供了从网络层到系统层的深度排查与修复指南。详细介绍了DNS修改、代理配置、防火墙设置、系统服务检查等5种核心修复方法,并包含离线安装与手动补丁等替代方案,帮助开发者彻底解决安装难题。

sprite的博客 1618

QTableView通过setColumnWidth设置了列宽无效的问题

QTableView通过setColumnWidth设置了列宽无效的问题

ml29895063的博客 2481

PCB印刷电路缺陷检测实战:从数据集准备到模型训练全流程解析

本文详细解析了PCB缺陷检测从数据集准备到模型训练的全流程。重点介绍了PKU-Market-PCB数据集的特点与下载方法,并提供了数据格式转换、模型选择(如YOLOv8)与训练配置的实战代码。针对PCB小目标检测的难点,文章给出了数据分析和模型优化的具体策略,帮助读者构建高效的缺陷检测系统。

weixin_29065791的博客 547

【Python Turtle合集】有趣好玩的代码当然要分享给大家啦~(皮卡丘、玫瑰花、小黄人......)

前言 🚀 作者 :“程序员梨子” 🚀 **文章简介 **:本篇文章主要是写了利用Turtle库绘制四种不一样的图案的小程序! 🚀 **文章源码免费获取 : 为了感谢每一个关注我的小可爱💓每篇文章的项目源码都是无 偿分享滴💓👇👇👇👇 点这里蓝色这行字体自取,需要什么源码记得说标题名字哈!私信我也可! 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 正文 今天给大家介绍一个好玩儿的库,嘻嘻! Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵

TZ45678的博客 3万+

python tableview 列宽_Qt如何按比例分配QTableView的列宽并且充满整个控件

展开全部由于Qt中的表格控件可以通62616964757a686964616fe4b893e5b19e31333365646239过从QTableView或QTableWidget派生子类实现。所以这里就可以利用表格的列宽和行高的设置来实现:方法一:1.调用表头的setSectionResizeMode()方法,代码如下:m_tableView->horizontalHeader()-&gt...

weixin_39969881的博客 1930

UWB 多传感器通信的纳秒无线位置和时钟同步方法

利用UWB高精度的特点,实现多节点下的无线时钟同步和定位。通过优化硬件架构,减少不确定延迟的影响,系统可以提供纳秒级时钟同步消息

DT程序员的博客 1329

使用技巧 - 设置QTableView的表头的列宽失效

在设置QTableView的表头的列宽失效的问题: 需要先调用 void QHeaderView::setSectionResizeMode(QHeaderView::ResizeMode mode) 为 QHeaderView::Interactive设置为用户可设置模式才能使 void QTableView::​setColumnWidth(int column, int width)生效。 ...

huixianji0815的博客 2872

【SpringBoot 4.x 第2节】夯爆了,学习 Spring Boot 4.x 前,需要具备哪些 Java 基础?

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 4569

ABB机器人刷功能选项全一篇就够——不怕丢失程序和IO配置数据

ABB机器人刷功能选项

m0_66701835的博客 1260

qtableview设置列宽度_Qt如何按比例分配QTableView的列宽并且充满整个控件?

展开全部由于Qt中的表格控件可以通过从QTableView或QTableWidget派生子类实现。所以这里就可以利用表格的列宽和行62616964757a686964616fe58685e5aeb931333365633864高的设置来实现:方法一:1.调用表头的setSectionResizeMode()方法,代码如下:m_tableView->horizontalHeader()-&gt...

weixin_33562004的博客 7826

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

qtableview设置列宽度_QTableView表格视图的列宽设置

m_tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);参数QHeaderView::ResizeToContens说明:调整列宽以适应单元内容。也就是说,当单元内的文本较长的时候,这种方法将会严重影响表格的阅读。这种方法只适合端文本内容的使用。此外,这种方法还有一个缺点,...

weixin_39769984的博客 2927

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

关于QTableView列宽的小细节

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 QTableView列宽的小细节前言一、QTableView的model变化也会间接影响到列宽的变化总结 前言 我们经常会用到: QTableView对象.setColumnWidth(列号,宽度) 你以为只要用了这个就万事大吉了?No~ 一、QTableView的model变化也会间接影响到列宽的变化 当我们清空model时: model对象.clear() QTableView的列宽会变为0。 然后我们更新model: QTable

Rui_Tang0811的博客 680

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

PyQt(Python+Qt)学习随笔:QTableView中数据行高和列宽的调整方法

老猿Python博文目录 老猿Python博客地址 一、概述 在QTableView中,除了采取缺省的间隔显示行和列的数据外,还可以通过带调整数据的行高和列宽。 二、列宽调整方法 调整数据行列宽的方法有如下几个: setColumnWidth(int column, int width),其中column是列序号,从0开始 resizeColumnToContents(int colum...

老猿Python 3350

二十、QTableView设置列宽不生效问题解析

一、问题及原因 QTableView类有一个成员方法:setColumnWidth(),显然是用来设置表格列宽的。但是,这里有个要求。所有对setColumnWidth()的调用都要放在填充数据之后。如果在设置View类的Model之前就调用该方法来设置列宽,是不会起作用的。 二、解决办法 在所有数据填充完毕之后,再调用 setColumnWidth() 设置列宽 ...

panchang199266的博客 4852

设置QTableView表头列宽

注:设置列宽宽必须在设置Model和ResizeMode之后,并且ResizeMode为QHeaderView::Fixed(或者为QHeaderView::Interactive),否则不会生效。

u011743621的博客 1244
上一篇: C++实现更改8位无符号整形的第n比特位值为1或0
下一篇: OSG多线程模型
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值