• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
sn-genuine
博客园    首页    新随笔    联系   管理    订阅  订阅

QMainWindow

QMainWindow 笔记

1. 概述

QMainWindow 是Qt的主窗口类,继承自 QWidget,是结构最复杂的标准窗口。
内置五大区域:菜单栏、工具栏、停靠窗口、中心部件、状态栏。

QWidget通用窗口没有这些部件,只有QMainWindow才有。

整体布局分层:

  1. 最上方:菜单栏 menuBar
  2. 菜单栏下方:工具栏区域 Tool Bar Area,可多个,上下左右停靠
  3. 工具栏内侧:停靠窗口区域 Dock Widget Area,可多个
  4. 中间:中心部件 Central Widget(程序主要内容区域,必须有)
  5. 窗口最底部:状态栏 statusBar
部件 数量限制 位置说明
菜单栏 QMenuBar 只能1个 窗口最顶部
工具栏 QToolBar 可以多个 支持上下左右四边停靠、拖拽浮动
状态栏 QStatusBar 只能1个 窗口最底部
停靠窗口 QDockWidget 可以多个 四边停靠,可拖拽悬浮
中心部件 CentralWidget 只能1个 窗口中间核心显示区域

2. 菜单栏 QMenuBar

概念

  • QMenuBar:菜单栏(顶部那一条)
  • QMenu:菜单(下拉块,例如“文件”下拉面板)
  • QAction:动作条目(下拉里面每一行:打开、保存)

UI设计器操作

  1. ui文件顶部直接编辑文字创建菜单;
  2. 下方Action Editor管理所有QAction;
  3. QAction可以同时用于菜单栏、工具栏按钮,一份对象多处复用。

代码关键点

  1. Qt6 Windows平台坑:菜单项图标默认不显示
    • 全局属性要在QApplication构造之前静态设置
    • 每个QAction单独开启 setIconVisibleInMenu(true)
    • 菜单图标建议尺寸:16×16 /24×24,大图会被裁剪
  2. QAction信号:triggered() 点击触发
connect(ui->open_action,&QAction::triggered,this,[=](){
    qDebug()<<"点击打开";
});

注意:窗口左上角图标(setWindowIcon) 和下拉菜单项图标是两套东西,尺寸要求不一样。


3. 工具栏 QToolBar

  1. 一个窗口可以拥有多个工具栏
  2. 可以拖拽停靠到窗口上、下、左、右四边,也可以变成悬浮小窗口
  3. 既可以添加QAction,也可以addWidget嵌入普通控件(按钮、输入框QLineEdit)
// 给已有工具栏添加控件
ui->toolBar->addWidget(new QPushButton("搜索"));
QLineEdit* edit = new QLineEdit;
edit->setFixedWidth(100);
ui->toolBar->addWidget(edit);

// 创建第二个工具栏,放到左侧停靠
QToolBar* toolBar = new QToolBar("toolBar");
this->addToolBar(Qt::LeftToolBarArea,toolBar);
  • 工具栏使用QAction时,会自动显示Action的图标。

4. 状态栏 QStatusBar(窗口最底部)

只能有一个状态栏 ui->statusBar

常用API

  1. showMessage("文本",毫秒):显示临时消息,超时自动消失
  2. addWidget():往状态栏嵌入自定义控件(按钮、QLabel),靠左
  3. addPermanentWidget():永久控件,靠右
// 临时消息,2000ms后消失
ui->statusbar->showMessage("我是状态栏...",2000);

// 添加普通控件
QPushButton* button = new QPushButton("按钮");
ui->statusbar->addWidget(button);
QLabel* labe = new QLabel("hello world");
ui->statusbar->addWidget(labe);

注意:控件addWidget加入状态栏默认是隐藏的,需要手动show();可以用QTimer::singleShot延迟显示。

QTimer::singleShot(5000,this,[=](){
    button->show();
    labe->show();
});

5. 停靠窗口 QDockWidget

  • 可以多个,可拖拽、可悬浮、可停靠四边;
  • UI设计器直接拖拽创建dockWidget;
  • 内部承载子控件,形成浮动面板。

6. 中心部件 CentralWidget

  • QMainWindow必须要有中心部件,ui文件默认自动生成centralwidget;
  • 所有业务主界面放在这里;
  • 如果没有中心部件,窗口中间区域空白无法放置控件。

7. QAction 复用重点(面试)

QAction是动作对象,可以同时挂载:

  1. 菜单栏下拉条目
  2. 工具栏图标按钮
    一份Action,多处使用;信号只需要connect一次。

8. Qt6菜单图标踩坑总结(面试考点)

  1. AA_DontShowIconsInMenus 必须静态调用,QApplication实例创建之前;
  2. Windows平台Qt6,全局属性不一定生效,每个Action需要:setIconVisibleInMenu(true);
  3. 菜单项图标建议 16‑24px,大图不会自动缩放只会裁剪;
  4. 图标优先使用qrc资源文件,pro必须写RESOURCES += res.qrc;本地磁盘路径运行极易丢失图标。

9. 常见面试简答

Q:QMainWindow和QWidget区别?

QWidget是基础窗口控件,只有窗口,没有菜单栏、工具栏、状态栏;
QMainWindow继承QWidget,专门做主程序主窗口,内置菜单栏、工具栏、状态栏、停靠窗口、中心部件整套结构。

Q:QAction是什么?

QAction是抽象动作,封装图标、文字、点击信号,可以同时给菜单、工具栏共用,实现一份逻辑多处使用。

posted on 2026-09-01 17:18  SobNov  阅读(5)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3