news 2026/5/16 4:00:48

Qt 主窗口全家桶:菜单栏、工具栏、状态栏与对话框完全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qt 主窗口全家桶:菜单栏、工具栏、状态栏与对话框完全指南

一、菜单栏

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

1、创建菜单栏

  • 代码示例:

  1. 方法一:用函数menuBar()创建菜单栏
    //创建菜单栏 QMenuBar* menubar=menuBar(); //将创建好的菜单栏放入窗口中 this->setMenuBar(menubar);
  2. 方法二:在堆上动态创建菜单栏
    QMenuBar* menubar=new QMenuBar(this); this->setMenuBar(menubar);

2、在菜单栏中添加菜单

  • 代码示例:
  1. 通过addMenu来添加菜单
    //创建菜单 QMenu* menu1=new QMenu("文件"); QMenu* menu2=new QMenu("编辑"); QMenu* menu3=new QMenu("视图"); //将菜单添加进菜单栏中 menubar->addMenu(menu1); menubar->addMenu(menu2); menubar->addMenu(menu3);

3、创建菜单项

  • 代码示例:
  1. 用QAction来创建菜单项
//创建菜单项 QAction* action1=new QAction("打开"); QAction* action2=new QAction("保存"); QAction* action3=new QAction("关闭"); //将菜单项添加到菜单中 menu1->addAction(action1); menu1->addAction(action2); menu1->addAction(action3);

4、在菜单栏之间添加分割线

  • 代码示例
  1. 用addSeparator()来实现添加分割线
//将菜单项添加到菜单中 menu1->addAction(action1); menu1->addSeparator();//添加分割线 menu1->addAction(action2); menu1->addSeparator();//添加分割线 menu1->addAction(action3);

5、综合运用

  • 创建菜单和中央控件
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("此处编写⽂本内容..."); }
  • 给菜单项添加动作
//连接信号槽 connect(action1,&QAction::triggered,this,&MainWindow::load); connect(action2,&QAction::triggered,this,&MainWindow::save); connect(action3,&QAction::triggered,this,&MainWindow::close);
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()函数来创建工具栏
//创建工具栏 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

    以上四个位置均可停靠

  • 方法一:创建工具栏的同时指定其停靠的位置。
//创建工具栏 QToolBar* toolbar=new QToolBar(this); //设置工具栏在顶部显示 this->addToolBar(Qt::TopToolBarArea,toolbar);

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

3、设置浮动属性

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

4、设置移动属性

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

5、综合运用

  • 可以移动
  • 任意位置停靠
  • 可以悬停
//创建工具栏 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()创建状态栏。
//创建状态栏 QStatusBar* stbar=statusBar(); //将状态栏设置到窗口 setStatusBar(stbar);

2、实时信息

  • 通过showMessage()函数来设置一个实时信息。
  • 可以控制显示多少秒之后消失。
//设置实时信息 stbar->showMessage("运行正常",2000);

3、永久信息

  • 通过label来建立一个永久信息。
  • 利用addPermanentWidget()可以将标签设置到状态栏右边。
//建立标签 QLabel* label1=new QLabel("左侧永久信息",this); QLabel* label2=new QLabel("右侧永久信息",this); //信息显示 stbar->addWidget(label1); //右侧信息显示 stbar->addPermanentWidget(label2);

四、浮动窗口

  • 浮动窗⼝是通过 QDockWidget类 来实现浮动的功能。

1、浮动窗口的创建

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

2、设置停靠位置

枚举值

含义

Qt::LeftDockWidgetArea

停靠在主窗口左侧

Qt::RightDockWidgetArea

停靠在主窗口右侧

Qt::TopDockWidgetArea

停靠在主窗口顶部

Qt::BottomDockWidgetArea

停靠在主窗口底部

Qt::AllDockWidgetAreas

允许在上述所有区域停靠

  • 浮动窗⼝是位于中⼼部件的周围。
  • 可以通过QDockWidget类中提供setAllowedAreas()函数设置其允许停靠的位置。
//设置窗口只允许上下停靠 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)

定义:对话框弹出后,阻塞同一应用程序中其他窗口的用户交互,直到该对话框被关闭。

特点

  • 强制用户先处理对话框
  • 防止用户在未完成当前任务时操作其他部分
  • 通常用于需要用户确认或提供必要信息的场景
//当点击 "新建" 时,弹出⼀个模态对话框 connect(action4,&QAction::triggered,[=](){ QDialog dlog(this); dlog.resize(200,100); dlog.exec(); });

2️⃣ 非模态对话框(Modeless Dialog)

定义:对话框弹出后,阻塞同一应用程序中其他窗口的用户交互,直到该对话框被关闭。

特点

  • 强制用户先处理对话框
  • 防止用户在未完成当前任务时操作其他部分
  • 通常用于需要用户确认或提供必要信息的场景
//当点击 "新建" 时,弹出⼀个非模态对话框 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

阻塞整个应用程序

//当点击 "新建" 时,弹出⼀个半模态对话框 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(文件对话框)
  • 最常用的对话框,用于文件系统交互。
//文件对话框 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 颜色。
//颜色对话框 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(字体对话框)
  • 用于选择字体族、大小和样式。
//字体对话框 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(输入对话框)
  • 轻量级对话框,用于获取简单输入。
//输入对话框 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(消息对话框)
  • 用于向用户显示信息或请求确认。
//消息对话框 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) { // 执行删除 } });

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 4:00:48

绝缘子缺陷检测数据集2148张VOC+YOLO格式

绝缘子缺陷检测数据集2148张VOCYOLO格式数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2148 标注数量(xml文件个数)&#xff1a;2148 标注数…

作者头像 李华
网站建设 2026/5/16 3:57:18

LLM提示词编排引擎:构建可维护AI工作流的工程化实践

1. 项目概述&#xff1a;一个为大型语言模型设计的“交响乐指挥家”最近在折腾大语言模型应用开发的朋友&#xff0c;估计都遇到过同一个头疼的问题&#xff1a;提示词管理。当你手头有几个、十几个甚至几十个不同的LLM任务需要编排时&#xff0c;比如先让模型A做摘要&#xff…

作者头像 李华
网站建设 2026/5/16 3:57:17

3D高斯泼溅渲染技术:无排序随机渲染原理与优化

1. 3D高斯泼溅渲染技术概述3D高斯泼溅(3D Gaussian Splatting, 3DGS)是近年来计算机图形学领域的一项突破性技术&#xff0c;它通过大量可微分的高斯基元来表示三维场景&#xff0c;实现了高质量的实时神经辐射场渲染。这项技术的核心思想是将传统点云中的离散点替换为具有空间…

作者头像 李华
网站建设 2026/5/16 3:54:40

基于ESP8266与aREST框架的WiFi遥控小车制作全攻略

1. 项目概述&#xff1a;从零打造一个“听话”的WiFi小车几年前&#xff0c;当我第一次把一块ESP8266模块焊接到洞洞板上&#xff0c;看着它成功连上家里的WiFi并点亮一个LED时&#xff0c;那种感觉就像打开了一扇新世界的大门。一个成本不到一杯咖啡的芯片&#xff0c;竟然内置…

作者头像 李华
网站建设 2026/5/16 3:51:04

免费电商平台批量下载图片方法,好用的让你不敢相信

pc+浏览器方法,批量快速下载淘宝、拼多多、抖音等常用电商均满足。 全程不花一分钱,所有资源都免费。 方法简单,操作方便。 只需在浏览其中增加 (downpictures) 当图扩展即可。 一、操作方法如下: 1、如使用edge浏览器,访问这个网址:当图 ,然后点击按钮“获取”,…

作者头像 李华