cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMenu>
#include <QAction>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QMenu* pMenu=new QMenu();
QMenu* fileMenuItems=new QMenu();
QMenu* setMenuItems=new QMenu();
QList<QAction*>acList;
QList<QAction*>setList;
QAction* openFileAc=new QAction(QIcon(":/resources/file.png"),"打开文件",this);
QAction* openFloderAc=new QAction("打开文件夹",this);
QAction* openUrAc=new QAction("打开url",this);
QAction* play=new QAction(QIcon(":/resources/play.png"),"播放",this);
QAction* tools=new QAction(QIcon(":/resources/tools.png"),"工具",this);
QAction* sysSetAc=new QAction("系统设置",this);
QAction* playSetAc=new QAction("播放设置",this);
QAction* zimuSetAc=new QAction("字幕设置",this);
QAction* exitAc=new QAction(QIcon(":/resources/exit.png"),"退出",this);
//QMenu
fileMenuItems->setIcon(QIcon(":/resources/file.png"));
fileMenuItems->setTitle("文件");
setMenuItems->setTitle("设置");
setMenuItems->setIcon(QIcon(":/resources/set.png"));
//QAction
openFileAc->setShortcut(QKeySequence("Ctrl+8"));
//List
acList<<openFileAc<<openFloderAc<<openUrAc;
setList<<sysSetAc<<playSetAc<<zimuSetAc;
//add
fileMenuItems->addActions(acList);
setMenuItems->addActions(setList);
pMenu->addMenu(fileMenuItems);
pMenu->addAction(play);
pMenu->addAction(tools);
pMenu->addSeparator();
pMenu->addMenu(setMenuItems);
pMenu->addSeparator();
pMenu->addAction(exitAc);
ui->pushButton->setMenu(pMenu);
//connect
connect(openFileAc,&QAction::triggered,[=]{
QString filename=QFileDialog::getOpenFileName(this,"请选择视频文件","D:/","视频(*.mp4 *.flv)");
if(filename.isEmpty()){
return;
}
});
connect(exitAc,&QAction::triggered,[=]{
close();
});
}
MainWindow::~MainWindow()
{
delete ui;
}
-
QMenu和QPushButton关联
在这段代码中,通过
ui->pushButton->setMenu(pMenu);
将一个QMenu
对象与QPushButton
关联,点击按钮时可以弹出菜单。 -
主菜单和子菜单
pMenu
是主菜单,而fileMenuItems
和setMenuItems
是主菜单中的两个子菜单,分别用于文件管理和设置管理。 -
QList管理多个QAction
为了组织菜单项,使用了
QList<QAction*>
数据结构,例如acList
和setList
,用于批量存储多个QAction
对象。 -
QAction初始化两种方式
QAction
代表菜单中的具体操作项,初始化时可以指定图标和文本,例如openFileAc
使用图标和文本,openFloderAc
和openUrAc
仅使用文本。这些QAction
对象通过this
关联到父组件(通常是主窗口)。 -
子菜单设置图标和标题
子菜单通过
setIcon
和setTitle
方法设置图标和标题,以便用户识别不同的功能类别。例如,fileMenuItems
的图标和标题是与文件相关的操作。 -
设置快捷键
使用
setShortcut
方法为openFileAc
设置了Ctrl+8
的快捷键,方便用户快速调用该操作。 -
向QList和子菜单添加多个元素
多个
QAction
通过<<
运算符一次性添加到QList
中,然后通过addActions
批量添加到子菜单。主菜单pMenu
使用addMenu
和addAction
方法将子菜单和单独的操作项添加到菜单结构中,例如 "播放" 和 "工具"。 -
添加分割线
addSeparator
用于插入分割线,使菜单的视觉布局更加清晰。 -
信号和信号槽机制
通过信号与槽机制,使用
connect
函数将菜单项的触发信号与槽函数绑定。例如,点击 "打开文件" 时,会弹出文件选择对话框让用户选择视频文件;点击 "退出" 时,则会关闭程序。这些操作通过QAction::triggered
信号自动连接到相应的槽函数中执行。
triggered
是 QAction 类中的一个信号,它在用户与菜单项、工具栏按钮或其他关联了 QAction 的控件交互时被触发。
结尾
最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!