【QT入门】 Qt自定义控件与样式设计之QPushButton点击按钮弹出菜单

QT 实现点击按钮显示下拉菜单 QMenu 想实现点击按钮显示下拉菜单的效果: //初始化下拉菜单 QMenu* menu = new QMenu(this); actionIpSet = new QAction("按钮1", this); actionAuthorize = new QAction("按钮2", this); menu->addAction(actionIpSet); menu->addAction(actionAuthorize); menu->addSeparator(); menu-&gt 阅读详情
AI摘要

本文详细介绍了如何在Qt中使用QPushButton创建点击按钮弹出菜单,包括在构造函数和槽函数中设置菜单、实现多级菜单、添加动作、快捷键以及使用QSS样式表美化界面。

往期回顾:

【QT入门】 Qt自定义控件与样式设计之QPushButton实现鼠标悬浮按钮弹出对话框-优快云博客

【QT入门】 Qt自定义控件与样式设计之QComboBox样式表介绍-优快云博客

【QT入门】 Qt自定义控件与样式设计之QCheckBox qss实现按钮开关-优快云博客

 【QT入门】 Qt自定义控件与样式设计之QPushButton点击按钮弹出菜单

一、最终效果

二、逻辑实现

 按钮调用setMenu()方法添加菜单即可,非常简单。这里有两种写法,

1.写在widget构造函数里

第一种写在Widget的构造函数里,正常实现

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QMenu * fileMenu = new QMenu(this);

    QAction * pAc1 = new QAction("打开",this);
    QAction * pAc2 = new QAction("不打开",this);

    fileMenu->addAction(pAc1);
    fileMenu->addAction(pAc2);

    ui->pushButton->setMenu(fileMenu);
}

2.写在按钮的槽函数里

第二种写在按钮的槽函数里,此时会出现bug,需要点击两次按钮才会显示菜单,因为会先执行点击的槽函数。

void Widget::on_pushButton_clicked()
{
    QMenu * fileMenu = new QMenu(this);
    
    QAction * pAc1 = new QAction("打开",this);
    QAction * pAc2 = new QAction("不打开",this);
    
    fileMenu->addAction(pAc1);
    fileMenu->addAction(pAc2);
    
    ui->pushButton->setMenu(fileMenu);
}

三、 实现多级菜单

很多时候我们单击按钮弹出的不止一级菜单,而是多级,这里我们也实现一下。

1、最终效果

2、逻辑实现分析

 2.1一次性添加多个action

定义一个QAction类型的QList容器,可以直接添加多个action

QList<QAction*> acList;
acList << openFileAc << openFloderAc << openUrlAc;
fileMenuItems->addActions(acList);
2.2实现打开视频功能

之前是添加图片,这次是添加视频,这个QFileDialog的方法要足够熟悉

connect(openFileAc, &QAction::triggered, [=]{
        QString fileName = QFileDialog::getOpenFileName(this,
                                                        u8"请选择视频文件",
                                                        "D:/",
                                                        "视频(*.mp4 *.flv);;");

        if(fileName.isEmpty())
        {
            return;
        }
    });
2.3添加快捷键 

 QAction对象调用setShortcuts(QKeySequence::Print);

 QKeySequence的参数有很多个,慢慢了解

    QAction *openFileAc = new QAction(QIcon(":/resources/file.png"), u8"打开文件", this);
    //openFileAc->setShortcuts(QKeySequence::Print);  //设置快捷键
    openFileAc->setShortcut(QKeySequence("Ctrl+8"));  //设置快捷键而且能在QAction上显示出来
2.4原始字符串字面值 

使用了C++11中的原始字符串字面值(Raw String Literal)来初始化这个字符串。
原始字符串字面值使用R"()";来标识,其中括号内可以包含任意字符,包括换行符、引号等,而不需要对特殊字符进行转义。

menu_qss变量被定义为一个包含QSS样式表的字符串,使用原始字符串字面值可以方便地包含多行文本,而无需对其中的特殊字符进行转义。

    string menu_qss = R"(
        QMenu::item
        {
             font:16px;
             background-color:rgb(25,253,253);
             padding:8px 32px;
             margin:8px 8px;
             border-bottom:1px solid #FF0000;
        }
2.5fromStdString方法

用c++的string转QString要用fromStdString方法 

pMenu->setStyleSheet(QString::fromStdString(menu_qss));

3、最终代码 

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //定义菜单
    QMenu *fileMenuItems = new QMenu;

    //菜单添加icon
    fileMenuItems->setIcon(QIcon(":/resources/file.png"));
    fileMenuItems->setTitle(u8"文件");

    //定义一个QAction类型的QList容器,一会直接添加多个action
    QList<QAction*> acList;

    // action添加icon
    QAction *openFileAc = new QAction(QIcon(":/resources/file.png"), u8"打开文件", this);
    //openFileAc->setShortcuts(QKeySequence::Print);       //设置快捷键
    openFileAc->setShortcut(QKeySequence("Ctrl+8"));  //随意指定快捷键
    QAction *openFloderAc = new QAction(u8"打开文件夹", this);

    QAction *openUrlAc = new QAction(u8"打开url", this);

    //多级子菜单项一次性添加
    acList << openFileAc << openFloderAc << openUrlAc;
    fileMenuItems->addActions(acList);

    QMenu *pMenu = new QMenu;  //主菜单
    pMenu->addMenu(fileMenuItems);

    QAction *play = new QAction(QIcon(":/resources/play.png"), u8"播放", this);
    QAction *tools = new QAction(QIcon(":/resources/tools.png"), u8"工具", this);
    pMenu->addAction(play);
    pMenu->addAction(tools);

    pMenu->addSeparator();//添加横线

    QMenu *setMenuItems = new QMenu;
    setMenuItems->setTitle(u8"设置");
    setMenuItems->setIcon(QIcon(":/resources/set.png"));
    QList<QAction*> setList;

    QAction *sysSetAc = new QAction(u8"系统设置", this);
    QAction *playSetAc = new QAction(u8"播放设置", this);
    QAction *zimuSetAc = new QAction(u8"字幕设置", this);
    setList << sysSetAc << playSetAc << zimuSetAc;
    setMenuItems->addActions(setList);

    pMenu->addMenu(setMenuItems);

    pMenu->addSeparator();

    QAction *exitAc = new QAction(QIcon(":/resources/exit.png"), u8"退出", this);
    pMenu->addAction(exitAc);

    ui->pushButton->setMenu(pMenu);

    connect(openFileAc, &QAction::triggered, [=]{
        QString fileName = QFileDialog::getOpenFileName(this,
                                                        u8"请选择视频文件",
                                                        "D:/",
                                                        "视频(*.mp4 *.flv);;");

        if(fileName.isEmpty())
        {
            return;
        }
    });

    string menu_qss = R"(
        QMenu::item
        {
             font:16px;
             background-color:rgb(25,253,253);
             padding:8px 32px;
             margin:8px 8px;
             border-bottom:1px solid #FF0000;
        }

        /*选择项设置*/
        QMenu::item:selected
        {
             background-color: #00FF00;
        }
    )";
    
    pMenu->setStyleSheet(QString::fromStdString(menu_qss));
}

四、qss完善样式

 1、最终效果

相比上面,大家看是不是越来越ok。

2、样式表封装 

 主要有一个思路要知道,就是可以添加一个c++的.h类专门用来添加qss样式,然后在主类里引用这个类就可以了

2.1按钮样式
//按钮样式
string button_qss = R"(
    QPushButton
    {
        font:18px "Microsoft YaHei";
        color:rgb(255,255,255);
        border:none
    }

    //点击按钮打开菜单和关闭时按钮上的箭头图标不一样
    QPushButton::menu-indicator:open
    {
        image:url(:/resources/down_arrow.svg);  //照片直接用image
        subcontrol-position:right center;
        subcontrol-origin:padding;border:none;
    }

    QPushButton::menu-indicator:closed
    {
        image:url(:/resources/up_arrow.svg);
        subcontrol-position:right center;
        subcontrol-origin:padding;border:none;
    }
)";
2.2主菜单样式 
//主菜单样式
string menuQss = R"(
    QMenu
    {
        background-color:rgb(53, 63, 73);
    }

    QMenu::item
    {
         font:16px;
         color:white;
         background-color:rgb(53, 63, 73);
         padding:8px 32px;
         margin:8px 8px;
         /*border-bottom:1px solid #DBDBDB;  item底部颜色*/
    }

    /*选择项设置*/
    QMenu::item:selected
    {
         background-color:rgb(54, 54, 54);
    }
)";
2.3子菜单样式 
//子菜单样式
string menuItemQss = R"(
    QMenu
    {
        background-color:rgb(73, 73, 73);
    }

    QMenu::item
    {
         font:16px;
         color:white;
         background-color:rgb(73, 73, 73);
         padding:8px 32px;
         margin:8px 8px;
         /*border-bottom:1px solid #DBDBDB;  item底部颜色*/
    }

    /*选择项设置*/
    QMenu::item:selected
    {
         background-color:rgb(54, 54, 54);
    }
)";

3、最后直接引用就可以

    ui->pushButton->setText(u8"QW影音");
    ui->pushButton->setFixedSize(100, 32);
    
    //设置按钮样式
    ui->pushButton->setStyleSheet(QString::fromStdString(button_qss));
    //设置主菜单样式
    pMenu->setStyleSheet(QString::fromStdString(menuQss));

以上,就是QPushButton点击按钮弹出菜单的样式设计

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

QPushButton按钮功能 给按钮设置自动默认,默认情况下就已经是true了,如果设置为false的话,按钮就不会被焦点选中,其实不考虑键盘使用的话,可以不用管它。设置为扁平按钮时,按钮不显示按钮框,有文本的话只显示文本,只有鼠标去点击按钮时才会出现完整的按钮轮廓。主要用来窗口刚打开时,使焦点在按钮上,这样空格键和回车键按下时它直接能响应,一个窗口设置一个默认按钮就行。给按钮添加菜单,设置菜单后再点击按钮clicked信号就不会触发,而是弹出设置好的菜单。设置菜单后按钮的右边会多出来一个下箭头,可以叫QSS帮它体面。 阅读详情

相关推荐

Qt入门教程【基础控件篇】QPushButton按钮

Qt中QPushButton

小鱼酱的博客 3806

QT使用按钮打开新窗口

QT点击按钮弹出新窗口(新建窗口类的形式)

shenlaoli的博客 2万+

Qt 实现按钮点击显示下拉菜单的编程

下拉菜单是常见的用户界面组件,通过点击按钮触发显示菜单选项,为用户提供了方便的交互方式。本文将介绍如何使用 Qt 编程实现点击按钮显示下拉菜单的效果,并提供相应的源代码。首先,我们需要创建一个基于 Qt 的应用程序,并添加一个按钮作为触发器,以及一个下拉菜单作为需要显示的菜单选项。当你点击按钮时,将显示一个下拉菜单,其中包含三个选项。根据你的实际需求,你可以添加更多的菜单选项和相应的操作。方法将下拉菜单设置为按钮的菜单。这样,当用户点击按钮时,下拉菜单将显示出来。最后,我们设置主窗口的位置和大小,并调用。

TechCraze的博客 1673

【QT小记】QT中如何弹起菜单

在QT中使用鼠标右键弹起菜单,或左键长按弹出菜单的方法

林柒Sevenlin随记 3067

Qt pushbutton按钮弹出菜单

通过点击Qt中的pushbutton,可以弹出菜单,菜单选项是QAction,可以连接槽完成相应功能。Qt工程是基于Qt5.10.1 32位,Qt Creator 4.5.1(Community)

UE4 专用服务器搭建(UE4.27为例)

专用服务器、DS服务器

mimo134的博客 2775

用QT实现自定义样式按钮控件

在用QT开发界面程序时,默认的按钮控件样式不美观。当需要构建自定义的按钮样式,使界面显示效果更加美观时,可以对QT提供的默认按钮控件进行样式修改。本文提供了一种基于QT默认按钮控件,实现自定义样式按钮的方法。

琳琳简单点的博客 2424

SystemVerilog学习总结

因为选择的offer是IC验证,以前学的是设计,所以只能再学systemverilog(SV)和UVM了。在学习SV和UVM之前,我认为需要学习以下几个部分:数字电路、c++和verilog。因为IC验证确实有不少别的专业之前没学过数字电路和Verilog,所以还是最好先学习一下。 知识点的总结主要是通过systemverilog验证-测试平台编写指南这本书进行的,所以请看书。通过对这本书的目录进行重点的划分,然后再进行相关知识点的总结。最后,给出自己收集的别的博主IC EDA环境的虚拟机,以及使用虚拟机需

博主毕竟还是人,肯定会有错误,各位看的时候发现错误提出来就好 1万+

【Qt笔记】QPushButton控件详解

Qt中的QPushButton部件是Qt框架中极为重要且常用的一个控件,它在图形用户界面(GUI)开发中扮演着至关重要的角色。

qq_52924376的博客 2958

SCTPPortScan SCTP协议端口扫描、关联地址识别、传输状态检测

Windows:Winsock2+SCTP扩展)。- **SCTP API封装**:Linux下直接调用`socket()`、`connect()`、`getsockopt()`等系统函数,解析`struct sctp_status`和`struct sctp_paddrinfo`获取状态和关联地址。qDebug() << "开始SCTP扫描:" << ipList.size() << "个IP," << ports.size() << "个端口,共" << m_totalTasks << "个任务";

寒寒豆豆软件公司的博客 91

【AI大模型应用开发】3.2 RAG实战 - RAG应用+UI实现加载本地文件并对话

前面我们实现了RAG基本流程,今天我们在此基础上给它加个UI界面,在浏览器打开,实现上传本地文件、解析,并用大模型实现与该文档的对话。也就是一个阉割版demo版的ChatPDF或知识库对话系统。

同学小张的博客 3054

Qt——QPushButton控件的常见属性、方法和信号

这些信号表示了不同的按钮交互和状态变化,您可以将它们与相应的槽函数连接,以便在特定事件发生时执行所需的操作。,按钮将被指定为默认按钮,通常会显示一个默认的外观(例如,加粗的文本)。描述:设置按钮的"这是什么"帮助文本,通常用于上下文相关的帮助。描述:设置按钮的快捷键,用于在应用程序中触发按钮点击。描述:设置按钮的状态提示文本,通常在状态栏显示。描述:模拟按钮的点击动作,触发按钮的相应槽函数。用法:连接此信号以在按钮选中状态切换时执行操作。用法:连接此信号以在按钮被点击时执行操作。

qq_57737603的博客 9491

三菱FX5U气缸控制功能块(完整ST源代码+示例程序)

如果机器包含100个气缸,我们只需要修改数组的元素数量就可以了,效率非常的高。待续....博途PLC 面向对象系列之“双通气缸功能块“(SCL代码)_plc面向对象-优快云博客文章浏览阅读667次。本文介绍了博途PLC中面向对象编程的应用,重点讲解了双通气缸的功能块设计,包括双通电磁阀功能块、双通气缸的UDT数据类型以及SCL代码实现。同时,对比了双通与单通电磁阀的差异,并讨论了将单通气缸改造为双通气缸的方法,强调了双通气缸在安全性上的优势。

RXXW_Dor的博客 1028

Qt中如何利用QPushButton来实现一个弹出菜单

今天,需要做一个弹出菜单的工具栏,于是在网上去找这类的代码,手下找到的是类似于以下的代码: 是通过QPushButton类里面的函数 SetMenu(QMenu* );来实现的 代码如下: QFrame *m_allTools; QPushButton * m_Tool; QPushButton *m_Layer; QPushButton *m

南的专栏 5388

基于情感分析+聚类分析+LDA主题分析对服装产品类的消费者评论分析

本研究旨在通过对服装产品类的消费者评论进行综合分析,为企业提供更全面、更深入的市场洞察和决策支持。同时,本研究的方法和结果也可以为其他领域的消费者评论分析提供借鉴和参考。

m0_64336780的博客 2万+

52-Halcon-- smooth_object_model_3d函数功能(滑处理3D对象模型)

Halcon中smooth_object_model_3d算子详解 该算子用于3D模型平滑处理,提供三种算法:'laplacian'(快速去噪)、'taubin'(高质量防收缩)和'low_pass'(频域滤波)。核心参数包括迭代次数(默认5)、平滑强度(0-1)和边缘保护选项。典型应用包括扫描数据去噪、CAD模型光顺和逆向工程优化。支持自适应平滑、结合模型简化等高级技巧,并可通过分块处理优化大型模型性能。参数组合需根据具体场景选择,如快速去噪推荐拉普拉斯方法(5次迭代,强度0.3),特征保持推荐低通滤波(

weixin_45590420的博客 873

【C++QT】Buttons 按钮控件详解

在 Qt 的 `QtWidgets` 模块中,**Buttons 组控件**是用户交互的核心组件,涵盖触发操作、状态选择、对话框按钮布局等功能。本文包含 **QPushButton、QToolButton、QCheckBox、QRadioButton、QCommandLinkButton、QDialogButtonBox** 的详细用法、技巧及实战示例。

AAADiao的博客 2103

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

QPushButton 和 QToolButton 的深入解析

本文对比了Qt框架中的两种按钮控件QPushButton和QToolButton。QPushButton是标准按钮,适合表单提交、操作确认等明确操作场景,支持文本、图标和样式定制。QToolButton则更适合工具栏使用,支持弹出菜单和更灵活的样式设置。文章介绍了两种控件的基本功能、使用场景,并提供了示例代码。同时讲解了如何通过样式表和自定义绘制实现按钮的个性化效果,帮助开发者根据实际需求选择合适的控件并实现丰富的UI效果。

软件科学-郝学胜 1169

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Qt (6)【按钮类控件 | QPushButton | QCheckBox | QRadioButton | QToolButton】

由上图我们可以看出按钮类控件(QCheckBox)都继承自类,而,作为QWidget的子类,自然而然地继承了QWidget的所有属性,所以我们上一篇文章讲的QWidget类的属性都可以在按钮类的控件中使用。例如,可以使用text()方法获取按钮的文本,而使用setText()方法来设置文本。

Yawesh的博客 1547

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Qt类 | QPushButton类详解

QPushButton是任何图形用户界面中最常用的控件。按下(点击)按钮来命令计算机执行某个操作。典型的按钮有“确定”、“应用”、“取消”、“关闭”、“是”、“否”和“帮助”。按钮显示文本标签,可以通过在文本中用和号(&)前缀来指定快捷键;还可以选择性地显示一个小图标。按钮中重要的模式或状态包括可用或不可用(变灰,禁用)。标准按钮、菜单按钮。默认或正常。对话框中的默认按钮通常可以使用 Enter 或 Return 键“点击”。是否自动重复。是否按下。按钮的一个变体是菜单按钮。

zwcslj的博客 3175

【QT入门】Qt自定义控件与样式设计之qss的加载方式

【QT入门】Qt自定义控件与样式设计之qss的加载方式

LF__plus的博客 1399

QT控件提升之QPushButton提升为QMenu

当一个控件进行提升之后, 就有了新的功能, 在原来的一些特性基础上,发生一些新的改变。 QT控件提升方法: 1.需要写一个需要提升为某种功能的类。 2.打开qt设计师, 在对应需要提升的控件, 单击右键, 选择 “提升的窗口部件” , 在提升的类名和头文件输入框里, 分别填上你所写的类, 单击提升铵纽进行提升。 我这边进行了按钮提升为菜单, 部分源码如下: // popupbut...

lyj548926543的博客 1618

qt QPushButton总结

QPushButton 总结

enyp80的博客 1226

Qt 之 QPushButton,信号与槽机制

当我们开发基于Qt框架的图形用户界面(GUI)应用程序时,经常需要在界面上添加按钮来实现用户交互。Qt提供了一个名为 QPushButton 的类作为按钮控件的实现。QPushButton是Qt中的标准按钮类,旨在简化按钮的创建和使用。头文件 :#include < QPushButton >QPushButton 用于接受用户点击事件。QPushButton 是功能性组件,需要 父组件 作为 容器 QPushButton 能够在父组件中进行定位。函数名作用设置按钮的文本内容。设置按钮的图标。

wuyiyu_的博客 2569

深入浅出之QPushbutton

QPushButton 是 Qt 框架中的一个基本控件,它提供了一个可点击的按钮,是用户界面中最为常见和常用的控件之一。通过点击按钮,用户可以触发特定的应用程序操作。

浩瀚之水的专栏 1443
上一篇: 【QT入门】 Qt自定义控件与样式设计之QCheckBox qss实现按钮开关
下一篇: 【QT入门】Qt自定义控件与样式设计之QProgressBar用法及qss
从一的
博客等级 码龄5年 1995粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值