Qt添加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
相关产品推荐
相关产品推荐

