【QT】QTableWidget获取width为100,与真实值不符问题解决

背景

用stackedWidget内嵌2个QTableWidget页面,实现切换。在进行stackedWidget.width()的获取时候,可以正常获得ui界面设置的宽度值,但是在QTableWidget页面用同样的方式无法成功获取真实值,即使采用获取内容区域宽度(排除边框和内边距)的方式ui->tableWidgetConfig->viewport()->width();,或者采用获取整个控件宽度(包含边框)的方式ui->tableWidgetConfig->width()依旧不行。而且输出值为100。

ps:ui->tableWidgetConfig->width()等效于geometry().width() 和 geometry().height()。

问题分析

在进行宽度获取时返回不准确的值,通常是因为控件尚未完成布局计算,一般最好是在show()之后才进行宽度获取,但是由于QTableWidget是作为内嵌页面的形式存在,不存在直接show()显示的情况。此时考虑采用定时器的方式进行实现。

// 在初始化时启动一个单次定时器
QTimer::singleShot(0, this, [this]() {
    qDebug() << "真实宽度:" << ui->tableWidgetConfig->width();
});

在 Qt 中,QTimer::singleShot(0, …) 并不是真正的 “立即执行”,而是将代码延迟到当前事件循环结束后执行。这里的0毫秒表示:

  1. 不等待额外时间:定时器不会主动引入延迟;
  2. 事件循环优先级:代码会在当前所有待处理事件(如布局计算、重绘)完成后执行。

实操

// 1. 初始化UI
ui->setupUi(this);

// 2. 立即获取宽度(可能为100,不准确)
qDebug() << "立即获取宽度:" << ui->tableWidgetConfig->width();

// 3. 使用0ms定时器延迟获取
QTimer::singleShot(0, this, [this]() {
    qDebug() << "延迟后获取宽度:" << ui->tableWidgetConfig->width();
});

// 4. 显示窗口(可选)
show();

以上代码中加上了show();,为了更好说明定时器的使用情况。以上代码的执行顺序如下:

  1. setupUi()完成,控件初始化为默认尺寸。
  2. 打印 “立即获取宽度: 100”(设计器默认值)。
  3. show()被调用,触发布局计算和重绘。
  4. 当前事件循环结束,执行定时器中的lambda,打印真实宽度(如 917)。

在这里插入图片描述
最终完美解决问题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻傻虎虎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值