【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. 初始化UI
ui->setupUi(this);// 2. 立即获取宽度(可能为100,不准确)
qDebug() << "立即获取宽度:" << ui->tableWidgetConfig->width();// 3. 使用0ms定时器延迟获取
QTimer::singleShot(0, this, [this]() {qDebug() << "延迟后获取宽度:" << ui->tableWidgetConfig->width();
});// 4. 显示窗口(可选)
show();
以上代码中加上了show();
,为了更好说明定时器的使用情况。以上代码的执行顺序如下:
- setupUi()完成,控件初始化为默认尺寸。
- 打印 “立即获取宽度: 100”(设计器默认值)。
- show()被调用,触发布局计算和重绘。
- 当前事件循环结束,执行定时器中的lambda,打印真实宽度(如 917)。
最终完美解决问题!