Qt开发问题:QMainWindow内QLabel未按QBoxLayout垂直布局排列出现重叠
问题原因
- QMainWindow 作为 Qt 框架的主窗口类,自带内置的布局结构,预留了中央控件区、菜单栏、状态栏、停靠栏等固定功能区域,不允许直接对 QMainWindow 本身调用 setLayout 方法设置顶层布局,你代码中编写的
setLayout(new QBoxLayout(QBoxLayout::TopToBottom));实际不会生效,两个 QLabel 没有被布局管理器正确管控位置,所以出现重叠。 - 调用
layout()方法获取到的也不是你自行创建的 QBoxLayout 实例,而是 QMainWindow 内置的专用布局,往该布局中添加控件自然不会按照你期望的纵向规则排列。
解决方案
正确的实现逻辑是先创建一个通用 QWidget 作为主窗口的中央控件,再把自定义布局设置给这个中央控件,最后将标签添加到该布局中即可,修改后的构造函数代码如下:
rasp4home::ui::MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { paletteSetup(); mTime.setText("00.22"); mTime2.setText("00.21232"); // 创建中央控件并绑定到主窗口 QWidget *centralWidget = new QWidget(this); setCentralWidget(centralWidget); // 布局设置给中央控件,而非主窗口本身 QBoxLayout *mainLayout = new QBoxLayout(QBoxLayout::TopToBottom, centralWidget); mainLayout->addWidget(&mTime); mainLayout->addWidget(&mTime2); }
paletteSetup 方法无需做任何改动,修改后运行程序两个标签就会按照纵向顺序依次排列。
内容的提问来源于stack exchange,提问作者Kronephon
相关产品推荐
相关产品推荐

