【Qt窗口】—— 菜单栏

目录

(一)创建菜单栏

(二)在菜单栏中添加菜单

(三)创建菜单项

(四)在菜单项之间添加分割线

(五)综合示例


Qt 窗⼝是通过 QMainWindow类 来实现的。

  • QMainWindow 是⼀个为用户提供主窗⼝程序的类,继承⾃ QWidget 类,并且提供了⼀个预定义的布局。QMainWindow 包含 ⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆接部件)(dock widgets)、⼀个状态栏(status bar) 和⼀个 中⼼部件(central widget),它是许多应⽤程序的基础,如⽂本编辑器,图⽚编辑器等。

如下图为QMainwindow 中 各组件所处的位置:


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


(一)创建菜单栏

方式一

  • 菜单栏的创建可以借助于 QMainWindow类 提供的 menuBar() 函数来实现。menubar()函数原型如下:

方式二

  • 在堆上动态创建;
  • 使用 setMenuBar 把菜单栏放到窗⼝中.

(二)在菜单栏中添加菜单

创建菜单,并通过 QMenu 提供的 addMenu() 函数 来添加菜单。
代码示例:

cpp 复制代码
//创建菜单栏
QMenuBar *menubarmenuBar ()

//将菜单栏放入窗口中
this->setMenuBar(menubar);

//创建菜单
QMenu *menul = new QMenu("文件");
QMenu *menu2 = new QMenu("编辑");
QMenu *menu3 = new QMenu("构建");

//添加菜单到菜单栏中
menubar->addMenu(menu1);
menubar->addMenu(menu2);
menubar->addMenu(menu3);

(三)创建菜单项

在 Qt 中,并没有专⻔的菜单项类,可以通过 QAction 类,抽象出公共的动作。如在菜单中添加菜
单项.

  • 💡 QAction 可以给菜单栏使⽤, 也可以给⼯具栏使⽤.

示例:

cpp 复制代码
//创建菜单项
QAction *act1 = new QAction("open");
QAction *act2 = new QAction("close");
QAction *act3 = new QAction("create");

//将菜单项添加到菜单上
menu1->addAction(act1);
menul->addAction(act2);
menu1->addAction(act3);

(四)在菜单项之间添加分割线

在菜单项之间可以添加分割线。分割线如下图所⽰,添加分割线是通过 QMenu 类 提供的
addSeparator() 函数来实现

示例:

cpp 复制代码
//创建菜单项
QAction *act1 = new QAction("open");
QAction *act2 = new QAction("close");
QAction *act3 = new QAction("create");

//将菜单项添加到菜单上
menu1->addAction(act1);
menu1->addSeparator(); //在"open"和"close"中间添加分割线
menul->addAction(act2);
menu1->addAction(act3);

(五)综合示例

在窗口上创建⼀个菜单栏,在菜单栏中添加⼀些菜单,在某⼀个菜单中添加⼀些菜单项。

1、新建 Qt 项⽬

  • 注意:此时新建项⽬时选择的基类 QMainwindow ,如下图⽰:

2、在 "mainwindow.cpp" ⽂件中创建菜单和中央控件

  • 创建⼀个菜单栏, ⼀个菜单.
  • 两个菜单项: 保存, 加载
  • 创建⼀个 QTextEdit 作为窗⼝的中央控件.
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* menu = new QMenu("⽂件");
     menuBar->addMenu(menu);

     // 创建菜单项
     QAction* action1 = new QAction("保存");
     QAction* action2 = new QAction("加载");
     menu->addAction(action1);
     menu->addAction(action2);

     // 创建中央控件
     edit = new QTextEdit(this);
     this->setCentralWidget(edit);
     edit->setPlaceholderText("此处编写⽂本内容...");
}

3、给 action 添加⼀些动作

cpp 复制代码
// 连接信号槽, 点击 action 时触发⼀定的效果.
connect(action1, &QAction::triggered, this, &MainWindow::save);
connect(action2, &QAction::triggered, this, &MainWindow::load);

实现这两个槽函数
使用 QFileDialog 来实现选择⽂件的效果.

  • getSaveFileName ⽤于保存⽂件的场景. 此时的对话框可以输⼊⽂件名.
  • getOpenFileName ⽤于打开⽂件的场景. 此时的对话框可以获取到⿏标选择的⽂件名.

搭配 C++ 标准库的⽂件操作实现⽂件读写.

cpp 复制代码
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();
}

void MainWindow::load()
{
     // 弹出对话框, 选择打开的⽂件
     QFileDialog* dialog = new QFileDialog(this);
     QString fileName = dialog->getOpenFileName(this, "加载⽂件", "C:/Users/1/");
     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);
}

执行程序, 可以看到此时就可以通过程序来保存/加载⽂件了. 并且对⽂件进⾏编辑.


以上就是关于Qt窗口中菜单栏的全部知识介绍!!

相关推荐
IT女孩儿19 分钟前
JavaScript--WebAPI查缺补漏(二)
开发语言·前端·javascript·html·ecmascript
m0_7482389220 分钟前
webgis入门实战案例——智慧校园
开发语言·ios·swift
Clockwiseee34 分钟前
PHP伪协议总结
android·开发语言·php
小灰灰搞电子35 分钟前
Qt实现Android的图案密码(图形解锁)源码分享
开发语言·qt
吴冰_hogan2 小时前
JVM(Java虚拟机)的组成部分详解
java·开发语言·jvm
白宇横流学长3 小时前
基于java出租车计价器设计与实现【源码+文档+部署讲解】
java·开发语言
数据小爬虫@4 小时前
Java爬虫实战:深度解析Lazada商品详情
java·开发语言
songroom5 小时前
Rust: offset祼指针操作
开发语言·算法·rust
code04号5 小时前
C++练习:图论的两种遍历方式
开发语言·c++·图论
煤泥做不到的!6 小时前
挑战一个月基本掌握C++(第十一天)进阶文件,异常处理,动态内存
开发语言·c++