【三十一】【QT开发应用】QPushButton与QMenu

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 是主菜单,而 fileMenuItemssetMenuItems 是主菜单中的两个子菜单,分别用于文件管理和设置管理。

  • QList管理多个QAction

    为了组织菜单项,使用了 QList<QAction*> 数据结构,例如 acListsetList,用于批量存储多个 QAction 对象。

  • QAction初始化两种方式
    QAction 代表菜单中的具体操作项,初始化时可以指定图标和文本,例如 openFileAc 使用图标和文本,openFloderAcopenUrAc 仅使用文本。这些 QAction 对象通过 this 关联到父组件(通常是主窗口)。

  • 子菜单设置图标和标题

    子菜单通过 setIconsetTitle 方法设置图标和标题,以便用户识别不同的功能类别。例如,fileMenuItems 的图标和标题是与文件相关的操作。

  • 设置快捷键

    使用 setShortcut 方法为 openFileAc 设置了 Ctrl+8 的快捷键,方便用户快速调用该操作。

  • 向QList和子菜单添加多个元素

    多个 QAction 通过 << 运算符一次性添加到 QList 中,然后通过 addActions 批量添加到子菜单。主菜单 pMenu 使用 addMenuaddAction 方法将子菜单和单独的操作项添加到菜单结构中,例如 "播放" 和 "工具"。

  • 添加分割线
    addSeparator 用于插入分割线,使菜单的视觉布局更加清晰。

  • 信号和信号槽机制

    通过信号与槽机制,使用 connect 函数将菜单项的触发信号与槽函数绑定。例如,点击 "打开文件" 时,会弹出文件选择对话框让用户选择视频文件;点击 "退出" 时,则会关闭程序。这些操作通过 QAction::triggered 信号自动连接到相应的槽函数中执行。
    triggered 是 QAction 类中的一个信号,它在用户与菜单项、工具栏按钮或其他关联了 QAction 的控件交互时被触发。

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

相关推荐
重生之后端学习6 小时前
62. 不同路径
开发语言·数据结构·算法·leetcode·职场和发展·深度优先
栗子~~6 小时前
hardhat 单元测试时如何观察gas消耗情况
开发语言·单元测试·区块链·智能合约
The hopes of the whole village6 小时前
Matlab FFT分析
开发语言·matlab
兰文彬7 小时前
n8n 2.x版本没有内嵌Python环境
开发语言·python
yiyaozjk7 小时前
Go基础之环境搭建
开发语言·后端·golang
谁动了我的代码?7 小时前
VNC中使用QT的GDB调试,触发断点时与界面窗口交互导致整个VNC冻结
开发语言·qt·svn
We་ct7 小时前
LeetCode 212. 单词搜索 II:Trie+DFS 高效解法
开发语言·算法·leetcode·typescript·深度优先·图搜索算法·图搜索
OxyTheCrack7 小时前
【C++】简述main函数中的argc与argv
开发语言·c++
历程里程碑7 小时前
Linux 49 HTTP请求与响应实战解析 带http模拟实现源码--万字长文解析
java·开发语言·网络·c++·网络协议·http·排序算法
ZVAyIVqt0UFji7 小时前
高可用虚拟IP(HaVip)技术详解:原理、设计与应用
开发语言·网络·网络协议·tcp/ip·perl