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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:22:01