qt-C++笔记之addAction和addMenu的区别以及QAction的使用场景
code review!
文章目录
- qt-C++笔记之addAction和addMenu的区别以及QAction的使用场景
- 1.QMenu和QMenuBar的关系与区别
- 2.addMenu和addAction的使用场景区别
- 3.将QAction的信号连接到槽函数
- 4.QAction的使用场景
- 5.将例1修改为不使用QMainWindow,使用QWidget
- 6.QMenuBar *menuBar = new QMenuBar(&window); 详解
1.QMenu和QMenuBar的关系与区别
QMenu和QMenuBar是Qt中用于创建菜单的两个类,它们之间存在关系和区别。
-
关系:
QMenuBar是顶层窗口的菜单栏,通常位于窗口的顶部,负责承载和管理菜单。QMenu是菜单栏中的一个菜单项,可以包含子菜单、动作等。
通常情况下,你会创建一个
QMenuBar对象作为主窗口的菜单栏,然后使用addMenu方法添加多个QMenu对象作为菜单栏的菜单项。 -
区别:
QMenuBar是一个顶级窗口部件,用于承载和管理菜单。它通常只有一个,并且位于主窗口的顶部。QMenu是一个弹出菜单或子菜单,它可以包含多个菜单项(QAction),以及子菜单(另一个QMenu)。
总的来说,
QMenuBar是用于创建和管理菜单栏的部件,而QMenu是用于创建和管理菜单的部件。QMenuBar通常只有一个,用于承载多个QMenu对象,而每个QMenu对象可以包含多个菜单项和子菜单。
以下是一个简单的示例代码,演示了如何创建QMenuBar和QMenu:
例1

代码
#include <QApplication>
#include <QMainWindow>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QMainWindow mainWindow;
QMenuBar *menuBar = mainWindow.menuBar();
QMenu *fileMenu = menuBar->addMenu("File");
QAction *newAction = fileMenu->addAction("New");
QAction *openAction = fileMenu->addAction("Open");
QMenu *editMenu = menuBar->addMenu("Edit");
QAction *cutAction = editMenu->addAction("Cut");
QAction *copyAction = editMenu->addAction("Copy");
mainWindow.show();
return app.exec();
}
上述示例中,首先创建了一个QMenuBar对象,然后使用addMenu方法在菜单栏中添加了两个QMenu对象:File和Edit。每个QMenu对象又通过addAction方法添加了相应的动作(菜单项)。
总结:QMenuBar是用于创建和管理菜单栏的顶级窗口部件,而QMenu是用于创建和管理菜单的部件。QMenuBar可以包含多个QMenu对象作为菜单项,而每个QMenu对象可以包含多个菜单项和子菜单。
2.addMenu和addAction的使用场景区别
addMenu和addAction是用于在菜单(QMenu)中添加菜单项(QAction)的函数,它们有不同的使用场景和区别。
-
addMenu的使用场景:- 当你想要在菜单中添加一个子菜单时,使用
addMenu是合适的。通过addMenu方法,你可以在当前菜单中创建一个新的子菜单,并返回该子菜单的指针,以便进一步添加菜单项或子菜单。例如:QMenu *fileMenu = menuBar->addMenu("File"); QMenu *editMenu = menuBar->addMenu("Edit"); - 通常情况下,你会使用
addMenu在菜单栏(QMenuBar)或其他菜单(QMenu)中添加子菜单。
- 当你想要在菜单中添加一个子菜单时,使用
-
addAction的使用场景:- 当你想要在菜单中添加一个动作(菜单项)时,使用
addAction是合适的。通过addAction方法,你可以在当前菜单中添加一个动作,并返回该动作的指针,以便进一步设置动作的属性和信号槽。例如:QAction *newAction = fileMenu->addAction("New"); QAction *openAction = fileMenu->addAction("Open"); - 通常情况下,你会使用
addAction在菜单或子菜单中添加动作,以便用户可以执行相应的操作。
- 当你想要在菜单中添加一个动作(菜单项)时,使用
总结:
addMenu适用于在菜单中添加子菜单。addAction适用于在菜单中添加动作(菜单项)。
根据你的需求和菜单结构,选择合适的函数以在菜单中添加菜单项或子菜单。
3.将QAction的信号连接到槽函数
要将QAction的信号连接到槽函数,你需要使用QObject::connect函数。以下是一个示例代码,展示了如何连接QAction的triggered信号到槽函数:
// 假设你有一个名为 action 的 QAction 对象和一个名为 receiver 的接收者对象
// 定义槽函数
void MyReceiver::handleAction()
{
// 处理 QAction 的触发事件
// ...
}
// 在连接信号和槽之前,确保接收者对象 receiver 已经存在
// 连接信号和槽
QObject::connect(action, &QAction::triggered, receiver, &MyReceiver::handleAction);
在上面的代码中,MyReceiver是接收者类,其中定义了一个名为handleAction的槽函数。action是要连接的QAction对象,receiver是接收者对象的实例。
QObject::connect函数的第一个参数是发送信号的对象,第二个参数是信号的名称,第三个参数是接收者对象,第四个参数是槽函数的名称。你可以使用&ClassName::slotName语法来指定槽函数。
当action的triggered信号被触发时,与之连接的槽函数handleAction将被调用。你可以在槽函数中执行你想要的操作。
请确保在连接信号和槽之前,接收者对象receiver已经被正确创建和初始化。

代码
#include <QApplication>
#include <QMainWindow>
#include <QAction>
#include <QObject>
#include <QDebug>
#include <QMenu>
#include <QMenuBar>
// 定义接收者类
class MyReceiver : public QObject
{
public slots:
void handleAction()
{
qDebug() << "Action triggered!";
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建 QMainWindow
QMainWindow mainWindow;
// 创建 QAction
QAction *action = new QAction("My Action", &mainWindow);
// 创建接收者对象
MyReceiver receiver;
// 连接信号和槽
QObject::connect(action, &QAction::triggered, &receiver, &MyReceiver::handleAction);
// 将 QAction 添加到 QMainWindow 的菜单栏
QMenu *menu = mainWindow.menuBar()->addMenu("File");
menu->addAction(action);
// 显示 QMainWindow
mainWindow.show();
return app.exec();
}
4.QAction的使用场景
QAction不仅仅适用于菜单中的动作(菜单项),它还可用于其他用户界面元素和交互方式中。
虽然在菜单中添加动作是QAction的常见用法之一,但它也可以用于以下情况:
-
工具栏:
QAction可以用于在工具栏上添加按钮和其他交互元素。你可以将QAction对象添加到QToolBar中,从而在工具栏上创建可点击的按钮。 -
快捷键:
QAction可以与快捷键关联,使用户能够通过键盘快捷方式触发操作。通过setShortcut函数,你可以为QAction指定一个键盘组合,例如Ctrl+C或F5。 -
上下文菜单:
QAction可以与上下文菜单(右键菜单)关联。你可以将QAction添加到QMenu中,并在用户右键单击相关界面元素时显示上下文菜单。 -
工具提示和状态栏:
QAction可以通过设置工具提示和状态栏消息来提供有关操作的附加信息。用户将鼠标悬停在具有关联QAction的界面元素上时,工具提示将显示相应的文本。状态栏消息将在用户执行操作时显示在状态栏上。
总之,QAction是一个通用的用户交互元素,用于表示用户界面中的操作。它可以用于菜单、工具栏、快捷键、上下文菜单和其他需要与用户交互的地方。
5.将例1修改为不使用QMainWindow,使用QWidget

代码
#include <QApplication>
#include <QWidget>
#include <QMenuBar>
#include <QMenu>
#include <QAction>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QWidget window;
QMenuBar *menuBar = new QMenuBar(&window);
QMenu *fileMenu = menuBar->addMenu("File");
QAction *newAction = fileMenu->addAction("New");
QAction *openAction = fileMenu->addAction("Open");
QMenu *editMenu = menuBar->addMenu("Edit");
QAction *cutAction = editMenu->addAction("Cut");
QAction *copyAction = editMenu->addAction("Copy");
window.show();
return app.exec();
}
6.QMenuBar *menuBar = new QMenuBar(&window); 详解
QMenuBar *menuBar = new QMenuBar(&window); 这行代码的详细解释如下:
-
QMenuBar是 Qt 框架中的一个类,用于创建和管理菜单栏(Menu Bar)。 -
&window是一个指向QWidget对象的指针,表示菜单栏的父对象。在这种情况下,我们将菜单栏设置为窗口的子对象,以便在窗口关闭时自动释放菜单栏内存。 -
new QMenuBar(&window)使用new运算符进行动态内存分配,创建了一个QMenuBar对象。通过传递&window作为参数,我们将窗口设置为菜单栏的父对象。 -
QMenuBar *menuBar是一个变量声明,它指定了变量的类型为QMenuBar*即菜单栏的指针类型。 -
=是赋值操作符,用于将new QMenuBar(&window)的返回值赋给menuBar变量。这样,menuBar变量就指向了动态分配的菜单栏对象。
通过使用动态内存分配和指定父对象,我们可以确保在窗口关闭时,菜单栏对象会自动被销毁并释放内存。
总之, QMenuBar *menuBar = new QMenuBar(&window); 这行代码的作用是创建一个 QMenuBar 对象,并将其设置为窗口的菜单栏,并将菜单栏的指针存储在 menuBar 变量中,以便后续对菜单栏进行操作。




















