You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt添加QPushButton仅显示最后一个 前序按钮被覆盖问题

QPushButton 仅显示最后一个、前序按钮被覆盖问题修复

问题原因

代码存在3个核心错误,直接导致按钮显示异常:

  • 一个QWidget实例仅能绑定一个布局,你先给qwid绑定了QGridLayout,后续又重复绑定QHBoxLayout,Qt会自动丢弃之前的布局对象,触发布局计算异常
  • qwid->setLayout(hbox)被错误放在循环内部,每次添加按钮都会重复触发布局重设,控件位置计算逻辑混乱,最终仅渲染最后一次添加的控件
  • 存在两处笔误:buttonLbls初始化时最后一个字符串"button3缺少闭合双引号;循环内读取的变量名是buttonsLbls,和定义的buttonLbls不一致,会直接触发编译错误

修复后代码

如果你只需要水平排列按钮,直接删除冗余的网格布局定义,将布局设置移到循环外即可:

QWidget *qwid = new QWidget(this);
QTabWidget *qtab = new QTabWidget();
qtab->addTab(qwid, "name");

// 修正字符串笔误
QStringList buttonLbls({"button1", "button2", "button3"});
QHBoxLayout *hbox = new QHBoxLayout(qwid);
QPushButton *btnCount[3];

for(int i=0; i<3; i++)
{
   // 修正变量名笔误
   btnCount[i] = new QPushButton(buttonLbls[i], qwid);
   hbox->addWidget(btnCount[i]);
}
// 布局仅需设置一次,移到循环外部
qwid->setLayout(hbox);

// 不要忘记把Tab组件放到窗口主布局,否则标签页本身不会显示
QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(qtab);
this->setLayout(mainLayout);

嵌套布局场景说明

如果你确实需要同时使用网格布局和水平布局,不要重复给同一个widget设置布局,通过布局嵌套实现即可:

QWidget *qwid = new QWidget(this);
QGridLayout *gl = new QGridLayout(qwid);

// 先把其他需要放在网格里的控件通过gl->addWidget()添加
QStringList buttonLbls({"button1", "button2", "button3"});
QHBoxLayout *hbox = new QHBoxLayout();
QPushButton *btnCount[3];
for(int i=0; i<3; i++)
{
   btnCount[i] = new QPushButton(buttonLbls[i], qwid);
   hbox->addWidget(btnCount[i]);
}
// 把水平布局作为子项添加到网格布局的指定行列位置
gl->addLayout(hbox, 0, 0);

qwid->setLayout(gl);

内容的提问来源于stack exchange,提问作者doublej118

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:57:17