QMainWindow
QMainWindow 笔记
1. 概述
QMainWindow 是Qt的主窗口类,继承自 QWidget,是结构最复杂的标准窗口。
内置五大区域:菜单栏、工具栏、停靠窗口、中心部件、状态栏。
QWidget通用窗口没有这些部件,只有QMainWindow才有。
整体布局分层:
- 最上方:菜单栏
menuBar - 菜单栏下方:工具栏区域
Tool Bar Area,可多个,上下左右停靠 - 工具栏内侧:停靠窗口区域
Dock Widget Area,可多个 - 中间:中心部件 Central Widget(程序主要内容区域,必须有)
- 窗口最底部:状态栏
statusBar
| 部件 | 数量限制 | 位置说明 |
|---|---|---|
| 菜单栏 QMenuBar | 只能1个 | 窗口最顶部 |
| 工具栏 QToolBar | 可以多个 | 支持上下左右四边停靠、拖拽浮动 |
| 状态栏 QStatusBar | 只能1个 | 窗口最底部 |
| 停靠窗口 QDockWidget | 可以多个 | 四边停靠,可拖拽悬浮 |
| 中心部件 CentralWidget | 只能1个 | 窗口中间核心显示区域 |
2. 菜单栏 QMenuBar
概念
QMenuBar:菜单栏(顶部那一条)QMenu:菜单(下拉块,例如“文件”下拉面板)QAction:动作条目(下拉里面每一行:打开、保存)
UI设计器操作
- ui文件顶部直接编辑文字创建菜单;
- 下方
Action Editor管理所有QAction; - QAction可以同时用于菜单栏、工具栏按钮,一份对象多处复用。
代码关键点
- Qt6 Windows平台坑:菜单项图标默认不显示
- 全局属性要在
QApplication构造之前静态设置 - 每个QAction单独开启
setIconVisibleInMenu(true) - 菜单图标建议尺寸:16×16 /24×24,大图会被裁剪
- 全局属性要在
- QAction信号:
triggered()点击触发
connect(ui->open_action,&QAction::triggered,this,[=](){
qDebug()<<"点击打开";
});
注意:窗口左上角图标(setWindowIcon) 和下拉菜单项图标是两套东西,尺寸要求不一样。
3. 工具栏 QToolBar
- 一个窗口可以拥有多个工具栏
- 可以拖拽停靠到窗口上、下、左、右四边,也可以变成悬浮小窗口
- 既可以添加
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
showMessage("文本",毫秒):显示临时消息,超时自动消失addWidget():往状态栏嵌入自定义控件(按钮、QLabel),靠左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是动作对象,可以同时挂载:
- 菜单栏下拉条目
- 工具栏图标按钮
一份Action,多处使用;信号只需要connect一次。
8. Qt6菜单图标踩坑总结(面试考点)
AA_DontShowIconsInMenus必须静态调用,QApplication实例创建之前;- Windows平台Qt6,全局属性不一定生效,每个Action需要:
setIconVisibleInMenu(true); - 菜单项图标建议 16‑24px,大图不会自动缩放只会裁剪;
- 图标优先使用qrc资源文件,pro必须写
RESOURCES += res.qrc;本地磁盘路径运行极易丢失图标。
9. 常见面试简答
Q:QMainWindow和QWidget区别?
QWidget是基础窗口控件,只有窗口,没有菜单栏、工具栏、状态栏;
QMainWindow继承QWidget,专门做主程序主窗口,内置菜单栏、工具栏、状态栏、停靠窗口、中心部件整套结构。
Q:QAction是什么?
QAction是抽象动作,封装图标、文字、点击信号,可以同时给菜单、工具栏共用,实现一份逻辑多处使用。
浙公网安备 33010602011771号