一、菜单栏
- Qt 中的菜单栏是通过QMenuBar 这个类来实现的。
- 一个主窗口最多只有一个菜单栏。
- 位于主窗口顶部、主窗口标题栏下面。
- 菜单栏中包含菜单.菜单中包含菜单项。

1、创建菜单栏
- 代码示例:
-
方法一:用函数menuBar()创建菜单栏
cpp//创建菜单栏 QMenuBar* menubar=menuBar(); //将创建好的菜单栏放入窗口中 this->setMenuBar(menubar); -
方法二:在堆上动态创建菜单栏
cppQMenuBar* menubar=new QMenuBar(this); this->setMenuBar(menubar);
2、在菜单栏中添加菜单
- 代码示例:
-
通过addMenu来添加菜单
cpp//创建菜单 QMenu* menu1=new QMenu("文件"); QMenu* menu2=new QMenu("编辑"); QMenu* menu3=new QMenu("视图"); //将菜单添加进菜单栏中 menubar->addMenu(menu1); menubar->addMenu(menu2); menubar->addMenu(menu3);
3、创建菜单项
- 代码示例:
- 用QAction来创建菜单项
cpp
//创建菜单项
QAction* action1=new QAction("打开");
QAction* action2=new QAction("保存");
QAction* action3=new QAction("关闭");
//将菜单项添加到菜单中
menu1->addAction(action1);
menu1->addAction(action2);
menu1->addAction(action3);
4、在菜单栏之间添加分割线
- 代码示例
- 用addSeparator()来实现添加分割线
cpp
//将菜单项添加到菜单中
menu1->addAction(action1);
menu1->addSeparator();//添加分割线
menu1->addAction(action2);
menu1->addSeparator();//添加分割线
menu1->addAction(action3);
5、综合运用
- 创建菜单和中央控件
cpp
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//设置窗口标题
this->setWindowTitle("记事本");
//创建菜单栏
QMenuBar* menubar=new QMenuBar(this);
//将创建好的菜单栏放入窗口中
this->setMenuBar(menubar);
//创建菜单
QMenu* menu1=new QMenu("文件");
QMenu* menu2=new QMenu("编辑");
QMenu* menu3=new QMenu("视图");
//将菜单添加进菜单栏中
menubar->addMenu(menu1);
menubar->addMenu(menu2);
menubar->addMenu(menu3);
//创建菜单项
QAction* action1=new QAction("打开");
QAction* action2=new QAction("保存");
QAction* action3=new QAction("关闭");
//将菜单项添加到菜单中
menu1->addAction(action1);
menu1->addSeparator();//添加分割线
menu1->addAction(action2);
menu1->addSeparator();//添加分割线
menu1->addAction(action3);
//创建一个中央控件
QTextEdit* edit=new QTextEdit(this);
this->setCentralWidget(edit);
edit->setPlaceholderText("此处编写⽂本内容...");
}
- 给菜单项添加动作
cpp
//连接信号槽
connect(action1,&QAction::triggered,this,&MainWindow::load);
connect(action2,&QAction::triggered,this,&MainWindow::save);
connect(action3,&QAction::triggered,this,&MainWindow::close);
cpp
void MainWindow::load()
{
// 选择文件
QString fileName = QFileDialog::getOpenFileName(
this,
"加载文件",
QStandardPaths::writableLocation(QStandardPaths::HomeLocation),
"文本文件 (*.txt);;所有文件 (*.*)"
);
// 用户取消
if (fileName.isEmpty()) {
qDebug() << "用户取消选择";
return;
}
// 打开文件
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug() << "文件打开失败:" << file.errorString();
return;
}
// 读取内容
QTextStream in(&file);
in.setEncoding(QStringConverter::Utf8); // 自动处理 UTF-8
QString text = in.readAll();
file.close();
// 显示到界面
edit->setPlainText(text);
}
void MainWindow::save()
{
// 弹出对话框, 选择写入文件的路径
QFileDialog* dialog = new QFileDialog (this);
QString fileName = dialog->getSaveFileName (this , "保存文件 ", "C:/Users/1/");
qDebug() << "fileName: " << fileName;
// 写入文件
std::ofstream file(fileName.toStdString().c_str());
if (!file.is_open()) {
qDebug() << "文件保存失败!";
return;
}
const QString& text = edit->toPlainText ();
file << text.toStdString();
file.close ();
}
二、工具栏
- 工具栏是菜单项的一种快捷方式。
- 可以有多个也可以没有。
- 一般以图片的形式存在。

1、创建工具栏
- 调用QMainWindow类的addToolBar()函数来创建工具栏
cpp
//创建工具栏
QToolBar* toolbar=new QToolBar(this);
this->addToolBar(toolbar);
//将工具添加到工具栏
toolbar->addAction(action1);
toolbar->addAction(action2);
//设置图标
QIcon icon1("://open.png");
QIcon icon2("://save.png");
action1->setIcon(icon1);
action2->setIcon(icon2);

2、设置停靠位置
| 枚举值 | 含义 |
|---|---|
Qt::LeftToolBarArea |
停靠在左侧 |
Qt::RightToolBarArea |
停靠在右侧 |
Qt::TopToolBarArea |
停靠在顶部 |
Qt::BottomToolBarArea |
停靠在底部 |
Qt::AllToolBarAreas |
以上四个位置均可停靠 |
- 方法一:创建工具栏的同时指定其停靠的位置。
cpp
//创建工具栏
QToolBar* toolbar=new QToolBar(this);
//设置工具栏在顶部显示
this->addToolBar(Qt::TopToolBarArea,toolbar);

- 方法二:使用QToolBar类提供的setAllowedAreas()函数设置停靠位置。
cpp
//创建工具栏
QToolBar* toolbar=new QToolBar(this);
this->addToolBar(toolbar);
//只允许右边停靠
toolbar->setAllowedAreas(Qt::RightToolBarArea);

3、设置浮动属性
- 工具栏的浮动属性可以通过QToolBar类提供的setFloatable() 函数来设置。
cpp
//设置可以悬浮
toolbar->setFloatable(true);

4、设置移动属性
- 设置工具栏的移动属性可以通过QToolBar类提供的setMovable() 函数来设置。
cpp
//设置不能移动
toolbar->setMovable(false);

5、综合运用
- 可以移动
- 任意位置停靠
- 可以悬停
cpp
//创建工具栏
QToolBar* toolbar=new QToolBar(this);
this->addToolBar(toolbar);
//只允许右边停靠
toolbar->setAllowedAreas(Qt::AllToolBarAreas);
//设置可以悬浮
toolbar->setFloatable(true);
//设置不能移动
toolbar->setMovable(true);
//将工具添加到工具栏
toolbar->addAction(action1);
toolbar->addAction(action2);
//设置图标
QIcon icon1("://open.png");
QIcon icon2("://save.png");
action1->setIcon(icon1);
action2->setIcon(icon2);

三、状态栏
- 状态栏是应⽤程序中输出简要信息的区域。
- ⼀般位于主窗口的最底部。
- ⼀个窗口中最多只能有⼀个状态栏。
- 在Qt中状态栏是通过QStatusBar类来实现的。

1、状态栏的创建
- 通过QMainWindow提供的**statusBar()**创建状态栏。
cpp
//创建状态栏
QStatusBar* stbar=statusBar();
//将状态栏设置到窗口
setStatusBar(stbar);

2、实时信息
- 通过**showMessage()**函数来设置一个实时信息。
- 可以控制显示多少秒之后消失。
cpp
//设置实时信息
stbar->showMessage("运行正常",2000);
3、永久信息
- 通过label来建立一个永久信息。
- 利用**addPermanentWidget()**可以将标签设置到状态栏右边。
cpp
//建立标签
QLabel* label1=new QLabel("左侧永久信息",this);
QLabel* label2=new QLabel("右侧永久信息",this);
//信息显示
stbar->addWidget(label1);
//右侧信息显示
stbar->addPermanentWidget(label2);

四、浮动窗口
- 浮动窗⼝是通过 QDockWidget类 来实现浮动的功能。

1、浮动窗口的创建
- 浮动窗⼝的创建是通过QDockWidget类提供的构造⽅法**QDockWidget()**函数动态创建的
cpp
//创建窗口
QDockWidget* dockwidget=new QDockWidget("浮动窗口",this);
addDockWidget(Qt::AllDockWidgetAreas,dockwidget);

2、设置停靠位置
| 枚举值 | 含义 |
|---|---|
Qt::LeftDockWidgetArea |
停靠在主窗口左侧 |
Qt::RightDockWidgetArea |
停靠在主窗口右侧 |
Qt::TopDockWidgetArea |
停靠在主窗口顶部 |
Qt::BottomDockWidgetArea |
停靠在主窗口底部 |
Qt::AllDockWidgetAreas |
允许在上述所有区域停靠 |
- 浮动窗⼝是位于中⼼部件的周围。
- 可以通过QDockWidget类中提供**setAllowedAreas()**函数设置其允许停靠的位置。
cpp
//设置窗口只允许上下停靠
dockwidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);


五、对话框
对话框是 GUI 程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。Qt 常用的内置对话框有:
| 类名 | 作用 | 最常用静态函数 |
|---|---|---|
| QFileDialog | 选择文件或文件夹 | getOpenFileName()、getSaveFileName()、getExistingDirectory() |
| QColorDialog | 选择颜色 | getColor() |
| QFontDialog | 选择字体 | getFont() |
| QInputDialog | 获取简单用户输入 | getText()、getInt()、getDouble()、getItem() |
| QMessageBox | 提示、警告、确认 | information()、warning()、critical()、question() |

1、对话框的分类
| 类型 | 说明 | 使用方式 |
|---|---|---|
| **模态对话框(Modal)** | 阻塞其他窗口,必须关闭才能继续 | exec() |
| **非模态对话框(Modeless)** | 不阻塞,可与主窗口同时操作 | show() |
| **半模态(Application Modal)** | 阻塞整个应用,而非单个窗口 | setWindowModality() |
1️⃣ 模态对话框(Modal Dialog)
定义 :对话框弹出后,阻塞同一应用程序中其他窗口的用户交互,直到该对话框被关闭。
特点:
- 强制用户先处理对话框
- 防止用户在未完成当前任务时操作其他部分
- 通常用于需要用户确认或提供必要信息的场景
cpp
//当点击 "新建" 时,弹出⼀个模态对话框
connect(action4,&QAction::triggered,[=](){
QDialog dlog(this);
dlog.resize(200,100);
dlog.exec();
});

2️⃣ 非模态对话框(Modeless Dialog)
定义:对话框弹出后,阻塞同一应用程序中其他窗口的用户交互,直到该对话框被关闭。
特点:
- 强制用户先处理对话框
- 防止用户在未完成当前任务时操作其他部分
- 通常用于需要用户确认或提供必要信息的场景
cpp
//当点击 "新建" 时,弹出⼀个非模态对话框
connect(action4,&QAction::triggered,[=](){
QDialog* dlog=new QDialog(this);
dlog->resize(200,100);//设置窗口大小
dlog->setAttribute(Qt::WA_DeleteOnClose);//当窗口关闭时自动释放dlog
dlog->show();
});

3️⃣ 半模态对话框(Semi-Modal)
定义 :介于模态和非模态之间,通过 setWindowModality()控制阻塞范围。
| Qt::WindowModality | 说明 |
|---|---|
Qt::NonModal |
非模态,不阻塞任何窗口 |
Qt::WindowModal |
阻塞其父窗口及所有子窗口 |
Qt::ApplicationModal |
阻塞整个应用程序 |
cpp
//当点击 "新建" 时,弹出⼀个半模态对话框
connect(action4,&QAction::triggered,[=](){
QDialog* dialog = new QDialog(this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
// Qt::WindowModal 表示:只阻塞父窗口及其子窗口,不阻塞其他顶级窗口
dialog->setWindowModality(Qt::WindowModal);
dialog->resize(200, 100);
dialog->show(); // 继续使用 show(),因为它是非阻塞的
});

2、内置对话框
| 对话框 | 类名 | 核心用途 |
|---|---|---|
| 文件对话框 | QFileDialog |
打开/保存文件、选择文件夹 |
| 颜色对话框 | QColorDialog |
选取颜色 |
| 字体对话框 | QFontDialog |
选取字体样式 |
| 输入对话框 | QInputDialog |
获取文本、数字、列表项 |
| 消息框 | QMessageBox |
提示、警告、错误、确认 |
1️⃣ QFileDialog(文件对话框)
- 最常用的对话框,用于文件系统交互。
cpp
//文件对话框
QPushButton* btn=new QPushButton("文件对话框",this);
btn->move(300,400);
connect(btn,&QPushButton::clicked,[=](){
QString fileName = QFileDialog::getOpenFileName(
this,
"选择文件",
QDir::homePath(), // 默认路径
"Images (*.png *.jpg);;Text (*.txt);;All (*.*)" // 过滤器
);
});

2️⃣ QColorDialog(颜色对话框)
- 用于选取 RGB、HSV 或 CMYK 颜色。
cpp
//颜色对话框
QPushButton* btn=new QPushButton("颜色对话框",this);
btn->move(300,400);
connect(btn,&QPushButton::clicked,[=](){
QColor color = QColorDialog::getColor(
Qt::red, // 初始颜色
this,
"选择颜色",
QColorDialog::ShowAlphaChannel // 选项:显示透明度
);
if (color.isValid()) {
// 用户选择了有效颜色
}
});

3️⃣ QFontDialog(字体对话框)
- 用于选择字体族、大小和样式。
cpp
//字体对话框
QPushButton* btn=new QPushButton("字体对话框",this);
btn->move(300,400);
connect(btn,&QPushButton::clicked,[=](){
bool ok;
QFont font = QFontDialog::getFont(
&ok, // 返回用户是否点击了 OK
QFont("Arial", 12), // 初始字体
this,
"选择字体"
);
if (ok) {
// 用户确认了字体
}
});

4️⃣ QInputDialog(输入对话框)
- 轻量级对话框,用于获取简单输入。
cpp
//输入对话框
QPushButton* btn=new QPushButton("输入对话框",this);
btn->move(300,400);
connect(btn,&QPushButton::clicked,[=](){
bool ok;
QString text = QInputDialog::getText(
this, "输入", "用户名:",
QLineEdit::Normal, "默认文本", &ok
);
});

5️⃣ QMessageBox(消息对话框)
- 用于向用户显示信息或请求确认。
cpp
//消息对话框
QPushButton* btn=new QPushButton("消息对话框",this);
btn->move(300,400);
connect(btn,&QPushButton::clicked,[=](){
// 信息提示
QMessageBox::information(this, "提示", "操作成功!");
// 警告
QMessageBox::warning(this, "警告", "磁盘空间不足");
// 错误
QMessageBox::critical(this, "错误", "文件无法打开");
// 询问(带返回值判断)
int ret = QMessageBox::question(
this,
"确认",
"确定要删除吗?",
QMessageBox::Yes | QMessageBox::No,
QMessageBox::No
);
if (ret == QMessageBox::Yes) {
// 执行删除
}
});
