Qt 菜单栏QMenu、下拉菜单QAction、工具栏QToolBar的使用

2023-10-31

如下内容是实现一个菜单栏以及下拉菜单的制作:
在mainwindow.h中添加如下内容:

1 class QAction;
2 class QMenu;

在pro中添加QT += widgets。QMenu类作为菜单栏,QAction类作为点击菜单栏的下拉菜单使用QMenu类对象的addaction(QAction类的对象)来添加:
main.c如下:

 1 #include "mainwindow.h"
 2 
 3 int main ( int argc, char *argv[] ) {
 4     Q_INIT_RESOURCE ( application ); /* 初始化qrc资源 */
 5     QApplication a ( argc, argv );
 6     a.setOrganizationName ( "Qtporject" );
 7     a.setApplicationName ( "Application  hello Example" ); /* 给窗口添加name */
 8     MainWindow w;
 9     w.show();
10     return a.exec();
11 }

mainwindow.h如下:

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 class QPlainTextEdit;
 5 class QAction;
 6 class QMenu;
 7 
 8 class MainWindow : public QMainWindow {
 9     Q_OBJECT
10 public:
11     explicit MainWindow();
12     ~MainWindow();
13 private slots:
14     void test();
15 private:
16     void createActions();
17     void createMenus();
18     QPlainTextEdit *textEdit; /* 文本框 */
19     QMenu *fileMenu; /* file菜单 */
20     /* 定义了file的下拉菜单为new、open、save、saveAS、exit */
21     QAction *newAct;
22     QAction *open;
23     QAction *Save;
24     QAction *saveAs;
25     QAction *exit;
26 };
27 
28 #endif // MAINWINDOW_H

mainwindow.cpp如下:

 1 #include "mainwindow.h"
 2 
 3 MainWindow::MainWindow() {
 4     textEdit = new QPlainTextEdit; /* 创建一个文本编辑器 */
 5     setCentralWidget ( textEdit ); /* 设置文本编辑器为中心位置 */
 6     createActions(); /* 首先创建file下拉的菜单栏 */
 7     createMenus(); /* 再来创建菜单目录,把下拉菜单的内容addaction加入到menu中 */
 8 }
 9 
10 MainWindow::~MainWindow() {
11 }
12 
13 void MainWindow::test() {
14 }
15 
16 /* file下拉菜单,名字为new、open、Save、saveAs和exit,并且添加了快捷键和图标,以及相应的槽函数 */
17 void MainWindow::createActions() {
18     newAct = new QAction ( QIcon ( ":/image/new.png" ), tr ( "&New" ), this );
19     newAct->setShortcuts ( QKeySequence::New );
20     newAct->setStatusTip ( tr ( "Create a new file" ) );
21     connect ( newAct, SIGNAL ( triggered() ), this, SLOT ( test() ) ); /* New点击事件调用test */
22     open = new QAction ( QIcon ( ":/image/open.png" ), tr ( "&Open" ), this );
23     open->setShortcuts ( QKeySequence::Open );
24     open->setStatusTip ( tr ( "open a new file" ) );
25     connect ( open, SIGNAL ( triggered() ), this, SLOT ( test() ) ); /* 点击Open事件调用test */
26     Save = new QAction ( QIcon ( ":/image/save.png" ), tr ( "&Save" ), this );
27     Save->setShortcuts ( QKeySequence::Save );
28     Save->setStatusTip ( tr ( "Save a new file" ) );
29     connect ( Save, SIGNAL ( triggered() ), this, SLOT ( test() ) ); /* 点击Save事件调用test */
30     saveAs = new QAction ( tr ( "&SaveAs" ), this );
31     saveAs->setShortcuts ( QKeySequence::SaveAs );
32     newAct->setStatusTip ( tr ( "SaveAs a new file" ) );
33     connect ( saveAs, SIGNAL ( triggered() ), this, SLOT ( test() ) ); /* saveAS点击事件调用test */
34     exit = new QAction ( tr ( "&exit" ), this );
35     exit->setShortcuts ( QKeySequence::Close );
36     exit->setStatusTip ( tr ( "exit a new file" ) );
37     connect ( exit, SIGNAL ( triggered() ), this, SLOT ( close() ) ); /* 点击exit事件调用test */
38 }
39 
40 void MainWindow::createMenus() {
41     fileMenu = menuBar()->addMenu ( tr ( "&File" ) ); /* 创建一个name为file的菜单栏 */
42     /* 在这个菜单栏添加action即下拉菜单 */
43     fileMenu->addAction ( newAct );
44     fileMenu->addAction ( open );
45     fileMenu->addAction ( Save );
46     fileMenu->addAction ( saveAs );
47     fileMenu->addSeparator(); /* 添加一个分割器 */
48     fileMenu->addAction ( exit ); /* 推出下拉菜单 */
49 }

  

下文在原来的基础上添加了菜单栏edit、help,以及edit、help的下拉菜单,还添加了file工具栏和edit工具栏。菜单栏及下拉菜单与上面使用的一样,创建菜单栏类如下:

1 QMenu *fileMenu;
2 QMenu *editMenu;
3 QMenu *helpMenu;

下拉菜单的类如下:

 1 /* 定义edit的下拉菜单cut、copy、past */
 2 QAction *cut;
 3 QAction *copy;
 4 QAction *past;
 5 /* 定义help的下拉菜单about、aboutQt */
 6 QAction *about;
 7 QAction *aboutQt;
 8 edit与help的使用方法为:
 9 /* 创建一个name为edit的菜单栏 */
10 editMenu = menuBar()->addMenu ( tr ( "&Edit" ) );
11 /* 在这个菜单栏添加action,即下拉菜单 */
12 editMenu->addAction ( cut );
13 editMenu->addAction ( copy );
14 editMenu->addAction ( past );
15 
16 /* 创建一个name为help的菜单栏 */
17 helpMenu = menuBar()->addMenu ( tr ( "&Help" ) );
18 /* 在这个菜单栏添加action,即下拉菜单 */
19 helpMenu->addAction ( about );
20 helpMenu->addAction ( aboutQt );

工具栏使用的使用如下:

1 QToolBar *fileToolBar;
2 QToolBar *editToolBar;

使用方法为:

1 fileToolBar = addToolBar ( tr ( "File" ) );
2 fileToolBar->addAction ( newAct );
3 fileToolBar->addAction ( open ) ;
4 fileToolBar->addAction ( Save );
5 editToolBar = addToolBar ( tr ( "Edit" ) );
6 editToolBar->addAction ( cut );
7 editToolBar->addAction ( copy );
8 editToolBar->addAction ( past );

mainwindow.h如下:

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3 
 4 class QPlainTextEdit;
 5 class QAction;
 6 class QMenu;
 7 
 8 class MainWindow : public QMainWindow{
 9     Q_OBJECT
10 public:
11     explicit MainWindow();
12     ~MainWindow();
13 private slots:
14     void test();
15 private:
16     void createActions();
17     void createMenus();
18     void createToolBars();
19 
20     QPlainTextEdit *textEdit; /* 文本框 */
21     /* file菜单 */
22     QMenu *fileMenu;
23     QMenu *editMenu;
24     QMenu *helpMenu;
25     QToolBar *fileToolBar;
26     QToolBar *editToolBar;
27     /* 定义了file的下拉菜单为new、open、save、saveAS和exit */
28     QAction *newAct;
29     QAction *open;
30     QAction *Save;
31     QAction *saveAs;
32     QAction *exit;
33     /* 定义edit的下拉菜单cut、copy、past */
34     QAction *cut;
35     QAction *copy;
36     QAction *past;
37     /* 定义help的下拉菜单about aboutQt */
38     QAction *about;
39     QAction *aboutQt;
40 };
41 
42 #endif // MAINWINDOW_H

mainwindow.cpp代码:

 1 #include "mainwindow.h"
 2 
 3 MainWindow::MainWindow() {
 4     textEdit = new QPlainTextEdit;
 5     setCentralWidget ( textEdit );
 6     createActions(); /* 首先创建file下拉的菜单栏 */
 7     createMenus(); /* 再来创建菜单目录,把下拉菜单的内容addaction加入到menu中 */
 8     createToolBars();
 9 }
10 
11 MainWindow::~MainWindow() {
12 }
13 
14 void MainWindow::test() {
15 }
16 
17 void MainWindow::createActions() {
18     newAct = new QAction ( QIcon ( ":/image/new.png" ), tr ( "&New" ), this );
19     newAct->setShortcuts ( QKeySequence::New );
20     newAct->setStatusTip ( tr ( "Create a new file" ) );
21     connect ( newAct, SIGNAL ( triggered() ), this, SLOT ( test() ) );
22     open = new QAction ( QIcon ( ":/image/open.png" ), tr ( "&Open" ), this );
23     open->setShortcuts ( QKeySequence::Open );
24     open->setStatusTip ( tr ( "open a new file" ) );
25     connect ( open, SIGNAL ( triggered() ), this, SLOT ( test() ) );
26     Save = new QAction ( QIcon ( ":/image/save.png" ), tr ( "&Save" ), this );
27     Save->setShortcuts ( QKeySequence::Save );
28     Save->setStatusTip ( tr ( "Save a new file" ) );
29     connect ( Save, SIGNAL ( triggered() ), this, SLOT ( test() ) );
30     saveAs = new QAction ( tr ( "&SaveAs" ), this );
31     saveAs->setShortcuts ( QKeySequence::SaveAs );
32     newAct->setStatusTip ( tr ( "SaveAs a new file" ) );
33     connect ( saveAs, SIGNAL ( triggered() ), this, SLOT ( test() ) );
34     exit = new QAction ( tr ( "&exit" ), this );
35     exit->setShortcuts ( QKeySequence::Close );
36     exit->setStatusTip ( tr ( "exit a new file" ) );
37     connect ( exit, SIGNAL ( triggered() ), this, SLOT ( close() ) );
38     cut = new QAction ( QIcon ( ":/image/cut.png" ), tr ( "&Cut" ), this );
39     cut->setShortcuts ( QKeySequence::Cut );
40     cut->setStatusTip ( tr ( "Save a new file" ) );
41     connect ( cut, SIGNAL ( triggered() ), this, SLOT ( test() ) );
42     copy = new QAction ( QIcon ( ":/image/copy.png" ), tr ( "&Copy" ), this );
43     saveAs->setShortcuts ( QKeySequence::Copy );
44     copy->setStatusTip ( tr ( "SaveAs a new file" ) );
45     connect ( copy, SIGNAL ( triggered() ), this, SLOT ( test() ) );
46     past = new QAction ( QIcon ( ":/image/paste.png" ), tr ( "&Paste" ), this );
47     past->setShortcuts ( QKeySequence::Paste );
48     past->setStatusTip ( tr ( "exit a new file" ) );
49     connect ( past, SIGNAL ( triggered() ), this, SLOT ( close() ) );
50     about = new QAction ( tr ( "&about" ), this );
51     about->setStatusTip ( tr ( "SaveAs a new file" ) );
52     connect ( about, SIGNAL ( triggered() ), this, SLOT ( test() ) );
53     aboutQt = new QAction ( tr ( "&aboutQt" ), this );
54     aboutQt->setStatusTip ( tr ( "exit a new file" ) );
55     connect ( aboutQt, SIGNAL ( triggered() ), this, SLOT ( close() ) );
56 }
57 
58 void MainWindow::createToolBars() {
59     fileToolBar = addToolBar ( tr ( "File" ) );
60     fileToolBar->addAction ( newAct );
61     fileToolBar->addAction ( open );
62     fileToolBar->addAction ( Save );
63     editToolBar = addToolBar ( tr ( "Edit" ) );
64     editToolBar->addAction ( cut );
65     editToolBar->addAction ( copy );
66     editToolBar->addAction ( past );
67 }
68 
69 void MainWindow::createMenus() {
70     fileMenu = menuBar()->addMenu ( tr ( "&File" ) ); /* 创建一个name为file的菜单栏 */
71     /* 在这个菜单栏添加action即下拉菜单 */
72     fileMenu->addAction ( newAct );
73     fileMenu->addAction ( open );
74     fileMenu->addAction ( Save );
75     fileMenu->addAction ( saveAs );
76     fileMenu->addSeparator(); /* 添加一个分割器 */
77     fileMenu->addAction ( exit ); /* 推出下拉菜单 */
78     editMenu = menuBar()->addMenu ( tr ( "&Edit" ) ); /* 创建一个name为edit的菜单栏 */
79     /* 在这个菜单栏添加action即下拉菜单 */
80     editMenu->addAction ( cut );
81     editMenu->addAction ( copy );
82     editMenu->addAction ( past );
83     helpMenu = menuBar()->addMenu ( tr ( "&Help" ) ); /* 创建一个name为help的菜单栏 */
84     /* 在这个菜单栏添加action即下拉菜单 */
85     helpMenu->addAction ( about );
86     helpMenu->addAction ( aboutQt );
87 }

 

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 菜单栏QMenu、下拉菜单QAction、工具栏QToolBar的使用 的相关文章

  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 如何在不声明 32 个插槽的情况下将 32 个按钮的 pressed() 信号连接到单个函数?

    我有一个小部件 里面有 32 个按钮 我需要将每个按钮的 Pressed 信号连接到一个插槽 以便调用一个函数 该函数的参数取决于我按下的按钮 现在我通过以 on QPushButtonName pressed 的形式添加 32 个插槽来做
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • 专治疑难系列 - 解决win11中xbox开机自启问题

    博客主页 Passerby Wang的博客 CSDN博客 系统运维 云计算 Linux基础领域博主 所属专栏 专治疑难系列 上期文章 专治疑难系列 无法激活网络的解决方法 如觉得博主文章写的不错或对你有所帮助的话 还望大家多多支持呀 关注
  • RabbitMQ与KafKa区别

    在应用场景方面 RabbitMQ 遵循AMQP协议 由内在高并发的erlanng语言开发 用在实时的对可靠性要求比较高的消息传递上 kafka是Linkedin于2010年12月份开源的消息发布订阅系统 它主要用于处理活跃的流式数据 大数据
  • 中国知网html如何复制,中国知网如何快速导出参考文献的格式? 来看看吧

    写论文时 需要很多引文及注释 就需要把参考文献标注上 按照参考文献的引文格式一点一点整理很麻烦 涉及大量文献时费时费力 中国知网有快速导出参考文献格式的功能 可单个导出 也可以大量导出 方便实用 工具 材料 中国知网 论文 操作方法 01
  • idea彻底改java项目名(详细说明各个地方改名的作用)

    需求分析 要将手头的java项目文件夹改名 经常会出现以下问题 无法运行 只是改了别名 打war包 jar包的包名还是不变 解决方案 以下将项目名Easyfile改为驼峰命名的EasyFile 改项目名称 此时只改了别名 改文件夹名 解决编
  • Yolov3中Anchor box和confidence的理解(公式未编辑 待续....)

    Anchor box bounding box prior Anchor box原理解释 1 Anchor box其实就是从训练集的所有ground truth 中通过统计聚类的方法 k mean 得到常用的尺寸大小 比如 在某个训练集中最
  • MySQL有哪些锁

    这次 来说说 MySQL 的锁 主要是 Q A 的形式 看起来会比较轻松 在 MySQL 里 根据加锁的范围 可以分为全局锁 表级锁和行锁三类 全局锁 全局锁是怎么用的 要使用全局锁 则要执行这条命 flush tables with re
  • flutter 自定义组件-抽奖大转盘

    import dart async import dart math import dart ui as ui import dart ui import package demo widget luck luck entity dart
  • TypeScript 变量声明 —— 类型断言(Type Assertion)

    类型断言 Type Assertion TypeScript 允许你覆盖它的推断 并且能以任何你想要的方式分析它 这种机制被称为类型断言 类型断言使用 as 关键字或者
  • 查出反向木马的反向连接域名

    来源 ttian net 反向木马的主要种植手段是通过IE的众多漏洞 bt下载时不小心运行 或者来路不明的软件 使未打补丁的用户点击之后下载运行了木马程序 而这些用户基本都是拥有动态IP的个人用户 若不使用反向连接的方式 势必无法长久控制
  • k8s中创建pv和pvc

    1 创建一个pv apiVersion v1 kind PersistentVolume metadata name pv0003 名称 spec capacity storage 5Gi 卷大小 volumeMode Filesystem
  • Unity中自动识别串口以及热拔插

    最近需要在Unity中实现自动识别热拔插并识别串口的功能 实在没有找到原生的消息响应 折腾了一周 尝试了多种方法 总结一下主要有3种实现思路 1 利用Form类中的消息进行串口拔插消息的接收 2 实时保存串口信息到外部文件 进行判别 3 读
  • Vscode中安装 n 命令来切换 node 版本以适应不同项目不同的node版本号

    一 问题描述 Centos中第一次安装的node 因为下载的源码是最新的 是最新的版本18 14 0的 但发现项目启动的时候提示 二 解决办法 这时候会有两个选择 卸载node然后重新安装符合项目的版本 比较麻烦 有时候可能node还卸载不
  • 踩坑道路之——ubuntu下pt query digest无法分析慢查询日志

    刚才在使用pt query digest分析慢查询日志的时候 当我优雅的敲出 sudo pt query digest var lib mysql yang K45VD slow log 此时终端并没有像我所希望的那样 现实慢查询的分析结果
  • 浏览器内核,user-agent

    最近web界被红芯事件吵得沸沸扬扬 也激起了我对浏览器内核进一步的学习热情 先来看看user agent 它是我们前端开发获取用户操作系统 浏览器版本等数据的常用方法 UA存在于每次http请求的请求头中 像这样 Mozilla 5 0 W
  • 鸽子学统计

    文章目录 第一部分 基础统计 0 统计学的目的和本质 0 1 随机变量 0 2 统计分析的目的 0 3 统计学的本质 1 描述统计 1 1 变量的测量尺度分类 1 2 均值 1 3 众数和中位数 1 4 极差和标准差 1 5 偏度和峰度 1
  • linux:argument list too long的解决方案

    问题 展示 删除的文件数目过多时 linux命令会报错 如下 rm 命令 rm txt zsh argument list too long rm ls命令 ls txt zsh argument list too long ls 原因 猜
  • Outlook无需API开发连接钉钉群机器人,实现新增会议日程自动发送群消息通知

    Outlook用户使用场景 在企业中 会议和活动的顺利举行对于业务运转和团队协作至关重要 然而 计划的变动总是无法避免 这可能会导致其他人的计划受到影响 打乱原有的安排 为了解决这个问题 许多企业开始使用各种工具和技术来确保信息的及时传递和
  • 【计算机网络】MAC帧和PPP帧(定义+使用范围+区别+共同点)

    目录 0 前言 1 PPP的定义 1 1 点对点协议PPP Point to Point Protocol PPP 1 2 PPP帧 1 3 PPP帧的格式 1 3 1 首部 1 3 2 尾部 2 MAC的定义 2 1 媒体接入控制层MAC
  • 数据库多版本读场景

    session 1 session 2 select a from test return a 10 start transaction update test set a 20 start transaction select a fro
  • Qt 菜单栏QMenu、下拉菜单QAction、工具栏QToolBar的使用

    如下内容是实现一个菜单栏以及下拉菜单的制作 在mainwindow h中添加如下内容 1 class QAction 2 class QMenu 在pro中添加QT widgets QMenu类作为菜单栏 QAction类作为点击菜单栏的下