【三十一】【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 的控件交互时被触发。

结尾

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

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

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

相关推荐
午夜游鱼14 小时前
Go 泛型实战:一行代码封装 sync.Pool,性能与安全兼得
开发语言·安全·golang
索迪迈科技14 小时前
STL库——map/set(类函数学习)
开发语言·c++·学习
ForteScarlet15 小时前
Kotlin 2.2.20 现已发布!下个版本的特性抢先看!
android·开发语言·kotlin·jetbrains
anlogic15 小时前
Java基础 9.10
java·开发语言·算法
yongche_shi15 小时前
第二篇:Python“装包”与“拆包”的艺术:可迭代对象、迭代器、生成器
开发语言·python·面试·面试宝典·生成器·拆包·装包
Elastic 中国社区官方博客15 小时前
介绍 Python Elasticsearch Client 的 ES|QL 查询构建器
大数据·开发语言·数据库·python·elasticsearch·搜索引擎·全文检索
Hóng xīng qiáo15 小时前
swVBA自学笔记014、Lisp适合对SolidWorks进行二次开发吗 ?
开发语言·笔记·lisp
带鱼吃猫15 小时前
C++的诗行:一文读懂C++的继承机制
开发语言·c++·学习·visual studio
好多1716 小时前
《Java中的IO流》
java·开发语言·php
MetaverseMan16 小时前
Golang单例模式和工厂模式详解
开发语言·golang·适配器模式