如何使用QSpacerItem实现QVBoxLayout中新添加QPushButton居顶部显示
你需要修改两个核心逻辑,同时修正代码里的变量名不一致问题:
1. 调整初始化阶段的spacer插入顺序
原来你把spacer放在了布局最开头,后续添加的按钮都会排在spacer下方,自然无法整体靠上对齐,需要把spacer放到布局的最后一位,作为底部占位,将上方所有按钮顶到布局顶部。
2. 替换按钮添加接口
addWidget会默认将控件追加到布局的最末尾,要实现新按钮在最顶部,需要用insertWidget接口插入到布局索引为0的位置(QVBoxLayout的索引从上到下从0开始递增)。
3. 统一布局变量名
你构造函数中定义的布局变量为lVertical,但添加按钮的函数里误用了layoutVertical,变量名不一致会导致运行时报错,需要统一。
修正后的构造函数代码:
//frame is a QFrame lVertical = new QVBoxLayout(frame); //private变量 lVertical->setMargin(0); lVertical->setSpacing(0); connect(b, &QPushButton::clicked, this, &MainWindow::addToLayout); // 最后添加spacer,作为底部占位项 auto verticalSpacer = new QSpacerItem(10, 20, QSizePolicy::Minimum, QSizePolicy::Expanding); lVertical->addItem(verticalSpacer);
修正后的添加按钮函数代码:
void MainWindow::addToLayout() { QPushButton* button = new QPushButton(frameSlider); button->setText(QString::number(i)); ++i; //private变量 // 插入到布局最顶部(索引0位置) lVertical->insertWidget(0, button); }
修改后即可实现最新按钮排在最顶部,所有按钮整体靠布局顶部对齐的效果。
内容的提问来源于stack exchange,提问作者user16554286
相关产品推荐
相关产品推荐

