【Qt】窗口预览(1)—— 菜单栏

embedded/2024/10/9 5:20:27/

窗口预览(1)

  • 1. QMainWindow
  • 2. QMenuBar——菜单栏
    • 2.1 创建菜单栏/将菜单栏添加到widget中
    • 2.2 addMenu——在菜单栏中添加菜单
    • 2.3 在菜单中添加选项
    • 2.4 添加快捷键
    • 2.5 支持嵌套添加菜单
    • 2.6 添加信号
    • 2.7 添加分割线

1. QMainWindow

Qt窗口是通过QMainWindow类来实现的。
QMainWindow是⼀个为用户提供主窗口程序的类,继承自QWidget类,并且提供了⼀个预定义的布局。QMainWindow包含⼀个菜单栏(menu bar)、多个工具栏(tool bars)、多个浮动窗(铆接部件)(dock widgets)、⼀个状态栏(status bar)和⼀个中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为 QMainwindow 中各组件所处的位置:

在这里插入图片描述

我们之前创建文件的时候都是勾选的QWidget,但是这里我们要勾选QMainWindow

在这里插入图片描述
此时我们打开创建好的文件的ui文件,我们会发现一些与以往不同的地方:

  • 在窗口的最上方出现了一个编辑框,这个编辑框就是设置菜单的地方,同时在左侧的窗口属性中再也不是空的了,而是自动创建好了一个menubar,statusbar和centeralwidget。

在这里插入图片描述

2. QMenuBar——菜单栏

我们在使用很多的工具的时候在最上方都会有一个菜单栏,大部分的操作都是可以通过菜单栏进行实现功能的,我们的Qt creator也是如此。

在这里插入图片描述

2.1 创建菜单栏/将菜单栏添加到widget中

方法一:我们可以直接通过ui界面的最上方直接进行设置,因为我们创建文件的时候,QMainWindow以及给我们创建好了menuBar.

方法二:使用代码手动创建一个菜单栏,并将这个菜单栏设置到widget中,将菜单栏设置到widget函数setMenuBar(QMenuBar*)

注意:一般我们创建都是在堆上创建菜单栏,但是这里会出现一个问题,就是如果我们勾选了自动生成ui文件的话(一般我们都会进行勾选)当我们创建好了文件后,Qt会自动帮我们创建好一些代码,其中就包括了上面我们讲过了menubar,statusbar和centeralwidget这三个(这里我们就拿menubar来举例子,其他的也是一样的)如果我们直接使用QMenuBar * menu = new QMenuBar()的方式来创建菜单栏的话,就会导致内存泄漏,因为我们在创建好文件的时候Qt已经创建好了一菜单栏,而这里我们又手动的创建了一个菜单栏,就会把Qt帮我们创建的菜单栏给挤出对象树,所以当我们关闭窗口的时候对象树却是会帮我们delete掉我们手动创建的菜单栏,但是Qt帮我们创建的菜单栏就得不到delete就会造成内存泄漏,所以我们一般推提倡这样创建菜单栏:

QMenuBar* menu = this->menuBar();

2.2 addMenu——在菜单栏中添加菜单

通过QMenu创建菜单,使用addMenu将菜单添加到菜单栏中


MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建菜单栏QMenuBar* menu = this->menuBar();// 添加菜单栏this->setMenuBar(menu);// 创建菜单QMenu* menu1 = new QMenu("文件");QMenu* menu2 = new QMenu("工具");QMenu* menu3 = new QMenu("帮助");// 将菜单添加到菜单栏中menu->addMenu(menu1);menu->addMenu(menu2);menu->addMenu(menu3);
}

在这里插入图片描述

2.3 在菜单中添加选项

在Qt中可以通过QAction类创建出一个菜单选项,然后使用addAction函数添加到菜单中。

// 创建选项
QAction* opt1= new QAction("创建");
QAction* opt2= new QAction("打开");
QAction* opt3= new QAction("关闭");
// 将选项添加到菜单中
menu1->addAction(opt1);
menu1->addAction(opt2);
menu1->addAction(opt3);

在这里插入图片描述

2.4 添加快捷键

方法一:可以使用直接使用setShortcut函数来直接设置快捷键

方法二:可以使用(&+快捷键)(这样设置后直接使用alt + 快捷键即可使用快捷键)的方式直接进行设置快捷键

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建菜单栏QMenuBar* menu = this->menuBar();// 添加菜单栏this->setMenuBar(menu);// 创建菜单QMenu* menu1 = new QMenu("文件(&F)"); // 设置快捷键QMenu* menu2 = new QMenu("工具(&T)");QMenu* menu3 = new QMenu("帮助(&H)");// 将菜单添加到菜单栏中menu->addMenu(menu1);menu->addMenu(menu2);menu->addMenu(menu3);// 创建选项QAction* opt1= new QAction("创建");QAction* opt2= new QAction("打开");QAction* opt3= new QAction("关闭");// 将选项添加到菜单中menu1->addAction(opt1);menu1->addAction(opt2);menu1->addAction(opt3);// 设置快捷键opt1->setShortcut(QKeySequence("C"));opt2->setShortcut(QKeySequence("O"));opt3->setShortcut(QKeySequence("E"));
}

在这里插入图片描述

2.5 支持嵌套添加菜单

除了可以给菜单添加选项之外还可以给菜单添加菜单,也就是嵌套菜单。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建菜单栏QMenuBar* menu = this->menuBar();// 添加菜单栏this->setMenuBar(menu);// 创建菜单QMenu* menuparent= new QMenu("选项一");menu->addMenu(menuparent);// 创建选项QMenu* menuchild = new QMenu("子菜单");QAction* opt1 = new QAction("打开");QAction* opt2 = new QAction("关闭");menuparent->addAction(opt1);menuparent->addAction(opt2);// 给子菜单添加选项QAction* opt3 = new QAction("菜单一");QAction* opt4 = new QAction("菜单二");menuchild->addAction(opt3);menuchild->addAction(opt4);menuparent->addMenu(menuchild);
}

在这里插入图片描述

2.6 添加信号

这里一般都是给选项添加信号

connect(opt2, &QAction::triggered, this, &QMainWindow::close);
  • 使用QFileDialog 来实现选择文件的效果.
    • getSaveFileName 用于保存文件的场景. 此时的对话框可以输入文件名.
    • getOpenFileName 用于打开文件的场景. 此时的对话框可以获取到鼠标选择的文件名.
  • 搭配 C++标准库的文件操作实现文件读写.
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menubar = this->menuBar();this->setMenuBar(menubar);QMenu* menu = new QMenu("文件");menubar->addMenu(menu);// 创建菜单选项QAction* action1 = new QAction("保存");QAction* action2 = new QAction("加载");menu->addAction(action1);menu->addAction(action2);// 创建中央控件edit = new QTextEdit();this->setCentralWidget(edit);// 设置中央控件edit->setPlaceholderText("请在此处编辑内容……");// 设置槽函数connect(action1, &QAction::triggered, this, &MainWindow::save);connect(action2, &QAction::triggered, this, &MainWindow::load);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::save()
{// 弹出对话框,选择写入的文件的路径QFileDialog* dialog = new QFileDialog(this);QString fileName = dialog->getSaveFileName(this, "保存文件", "D:/App_2/Qt");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();
}void MainWindow::load()
{// 弹出对话框,选择打开的文件QFileDialog* dialog = new QFileDialog(this);QString fileName = dialog->getOpenFileName(this, "加载文件", "D:/App_2/Qt");qDebug() << "fileName" << fileName;// 加载文件std::ifstream file(fileName.toStdString().c_str());if(!file.is_open()){qDebug() << "文件打开失败";return;}std::string content;std::string line;while(std::getline(file, line)){content += line;content += "\n";}file.close();// 显示到界面上QString text = QString::fromStdString(content);edit->setPlainText(text);
}

保存文件
在这里插入图片描述
加载文件
在这里插入图片描述

2.7 添加分割线

使用addSeparator函数在两个选项中间即可

menu->addAction(action1);
menu->addSeparator();
menu->addAction(action2);

在这里插入图片描述


http://www.ppmy.cn/embedded/124896.html

相关文章

20 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示&#xff0c;设置电流阈值为80&#xff0c;电流小阈值为50&#xff0c;电压阈值为60&#xff0c;温度阈值…

C# 泛型集合实战:List<T>与Dictionary<TKey, TValue>的使用与优势

C# 中的泛型集合提供了类型安全和性能优势&#xff0c;是现代C#编程中不可或缺的一部分。List<T> 和 Dictionary<TKey, TValue> 是最常用的两个泛型集合类型&#xff0c;分别用于存储元素的列表和键值对的集合。 List List<T> 是一个可变大小的数组&#x…

Liunx各系统中间件查询脚本

Centos 6 #!/bin/bashecho "CentOS 6 系统软件信息收集"# 检查操作系统版本 echo "操作系统版本信息&#xff1a;" cat /etc/redhat-release# 检查JDK echo "检查JDK版本..." if command -v java &> /dev/null; thenjava -versionwhich …

关于鸿蒙next 调用系统权限麦克风

使用app的时候都清楚&#xff0c;想使用麦克风、摄像头&#xff0c;存储照片等&#xff0c;都需要调用系统的权限&#xff0c;没有手机操作系统权限你也使用不了app所提供的功能&#xff0c;虽然app可以正常打开&#xff0c;但是你需要的功能是没办法使用的。今天把自己在鸿蒙学…

LeetCode:871. 最低加油次数(DP Java)

目录 871. 最低加油次数 题目描述&#xff1a; 实现代码与解析&#xff1a; DP 原理思路&#xff1a; 871. 最低加油次数 题目描述&#xff1a; 汽车从起点出发驶向目的地&#xff0c;该目的地位于出发位置东面 target 英里处。 沿途有加油站&#xff0c;用数组 stations…

web框架 django基础-1

bs&cs 常见的软件架构有bs架构和cs架构。 1、工作原理 C/S结构,即Client/Server(客户机/服务器)结构,客户端负责发送请求和处理一部分业务逻辑,服务器端负责处理主要业务逻辑、数据存储和检索。客户端通常需要安装专用的软件。例如:QQ、Pycharm、网易云音乐(安装在…

Mac 电脑设置键盘 Command键

Mac 电脑设置键盘 Command键 如果 mac 电脑连接的第三方键盘&#xff0c;有些键盘没有 command 按键&#xff0c;导致有些功能没有办法使用&#xff0c;比如你想复制粘贴发现也不可以。这个时候你需要设置一个按键为 command 按键。 比如上图中是把 Alt 键设置为 Command 键。 …

WordPress 6.7即将发布的新功能(和截图)

我们一直在密切关注 WordPress 6.7 的开发并测试该版本的测试版&#xff0c;它将带来一些令人兴奋的更新和几个新功能。 例如&#xff0c;我们很高兴地发现即将发布的版本将附带全新的默认主题&#xff0c;并对块编辑器和站点编辑体验进行大规模改进。 在本文中&#xff0c;我…