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);// 创建 QMainWindowQMainWindow mainWindow;// 创建 QActionQAction *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);// 显示 QMainWindowmainWindow.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
变量中,以便后续对菜单栏进行操作。