如何让QMainWindow中的控件占据全部可用空间(代码实现)
解决方案:让QMainWindow控件占满可用空间
问题分析
从自动生成的UI代码可见,所有控件都通过setGeometry固定了位置和尺寸,导致窗口调整大小时控件无法自动拉伸填充空间。我们需要通过代码为对应容器添加布局,让控件自适应空间。
具体实现步骤
在MainWindow构造函数中,调用ui->setupUi(this)之后添加以下代码:
1. 让中央QTableView占满中央区域
为中央控件添加垂直布局,将tableView放入布局:
// 处理中央TableView QVBoxLayout* centralLayout = new QVBoxLayout(ui->centralwidget); centralLayout->setContentsMargins(0, 0, 0, 0); // 去掉默认边距 centralLayout->addWidget(ui->tableView);
2. 让first DockWidget中的垂直布局占满dock空间
为first dock的内容控件添加布局,将包含按钮的widget放入布局:
// 处理first DockWidget(dockWidget) QVBoxLayout* firstDockLayout = new QVBoxLayout(ui->dockWidgetContents); firstDockLayout->setContentsMargins(0, 0, 0, 0); firstDockLayout->addWidget(ui->widget); // 设置widget尺寸策略,确保填充布局空间 ui->widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
3. 让third DockWidget中的QSplitter占满dock空间
为third dock的内容控件添加布局,将splitter放入布局:
// 处理third DockWidget(dockWidget_3) QVBoxLayout* thirdDockLayout = new QVBoxLayout(ui->dockWidgetContents_3); thirdDockLayout->setContentsMargins(0, 0, 0, 0); thirdDockLayout->addWidget(ui->splitter); // 设置splitter尺寸策略 ui->splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // 让splitter内的两个TableView平分垂直空间(可选) ui->splitter->setStretchFactor(0, 1); ui->splitter->setStretchFactor(1, 1);
修改后的完整CtdMainWindow.cpp
#include "QtMainWindowWithDocks.h" #include "CtdMainWindow.h" #include <QVBoxLayout> #include <QSizePolicy> MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); // 1. 处理中央TableView QVBoxLayout* centralLayout = new QVBoxLayout(ui->centralwidget); centralLayout->setContentsMargins(0, 0, 0, 0); centralLayout->addWidget(ui->tableView); // 2. 处理first DockWidget QVBoxLayout* firstDockLayout = new QVBoxLayout(ui->dockWidgetContents); firstDockLayout->setContentsMargins(0, 0, 0, 0); firstDockLayout->addWidget(ui->widget); ui->widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // 3. 处理third DockWidget QVBoxLayout* thirdDockLayout = new QVBoxLayout(ui->dockWidgetContents_3); thirdDockLayout->setContentsMargins(0, 0, 0, 0); thirdDockLayout->addWidget(ui->splitter); ui->splitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); ui->splitter->setStretchFactor(0, 1); ui->splitter->setStretchFactor(1, 1); } MainWindow::~MainWindow() { delete ui; }
说明
- 设置
setContentsMargins(0,0,0,0)是为了去掉默认边距,让控件完全填充容器;如需保留边距可调整参数。 SizePolicy::Expanding确保控件在布局中自动拉伸以填充可用空间。setStretchFactor用于控制splitter内两个TableView的空间分配比例,可根据需求修改数值。
内容的提问来源于stack exchange,提问作者stoffy28
相关产品推荐
相关产品推荐

