qt自定义按钮类,每个按钮自带一个右键弹出框,如何使同一时刻只显示一个弹出框

提要

继承于QPushButton的自定义按钮类,其右键弹出一个弹框,创建多个这样的自定义按钮在窗口中,每一时刻只显示一个右键弹出框,避免同一时刻,多个按钮右键弹出弹出框后,未及时关闭弹出框导致的同一时刻有多个弹出框。

实现

1.在自定义的按钮里,创建按钮时在构造函数中传入参数id,用于区别不同的按钮,id是唯一的。

myButton(int index,QWidget *parent = nullptr);

上述的构造函数中参数index实际上就是按钮的id,创建按钮的时候传入,然后创建类成员变量来保存这个id.

int          m_index;//按钮的下标,用于区别点击的是哪个按钮

2.每个按钮,自带一个对话框,在自定义按钮的构造函数中创建,但是先不显示该对话框,在按钮上点击右键时显示弹出框。

myButton::myButton(int index,QWidget *parent)
:QPushButton(parent),m_index(index),m_isLongPress(false)
{
//    initBtnStyle();//在自定义控件的本身设置样式也可以,在调用类中设置自定义控件的样式也行m_configName = new configBtnNameDialog(this);connect(m_configName,&configBtnNameDialog::signalSave,this,&myButton::setSceneBtnName);
}

重写鼠标点击事件,在点击右键的时候,显示弹出框,

void myButton::mousePressEvent(QMouseEvent *e)
{if(e->button() == Qt::RightButton){//显示对话框showEditNameDlg();}QPushButton::mousePressEvent(e);
}

这样就会出现,创建几个按钮后,每在一个按钮上点击右键,就会弹出一个对话框,但是要想同一时刻只显示一个右键弹出框,就需要在每次点击右键时将之前已经显示的对话框隐藏掉。
3.采用信号槽来实现上述同一时刻只显示一个对话框
在显示右键弹出框后发送一个信号到按钮所在的父窗口,并通过这个信号将按钮的id传递到都窗口,这样父窗口就知道了那个按钮的右键弹出框已经显示了,再在每次点击右键对话框显示前发送信号到按钮的父窗口,告诉父窗口需要隐藏之前已经显示的对话框,这样按钮的父窗口可以根据之前传过去已经显示对话框的按钮的id,给改id的按钮发送信号,告知该按钮应该右键弹出框

void myButton::showEditNameDlg()
{if(m_configName != nullptr){m_configName->setGeometry(cursor().pos().x(),cursor().pos().y() - 10,m_configName->size().width(),m_configName->size().height());m_configName->show();emit signalShowDlgBtnId(m_id);//发送显示弹出框的按钮的id}
}

按钮的父窗口保存已经显示弹出框的按钮的id

void SystemScenenForm::slot_showDlgBtnId(int &id)
{m_showDlgBtnId = id;
}

每次点击按钮之前发信号给按钮的父窗口,使之前已经显示的右键弹出框隐藏。

void myButton::mousePressEvent(QMouseEvent *e)
{if(e->button() == Qt::RightButton){//若之前有弹出框存在,则先隐藏之前的弹出框emit sigHideShowDlg();showEditNameDlg();}QPushButton::mousePressEvent(e);
}

父窗口接收信号,发送信号到已经显示右键弹出框的按钮,

void SystemScenenForm::slot_hideShowDlg()
{emit sigHideBtnShowDlg(m_showDlgBtnId);
}

让其隐藏已经显示的右键弹出框。

void myButton::slot_hideBtnShowDlg(int &id)
{if(m_id == id){m_configName->hide();}
}

上述就可以解决一个自定义按钮类,右键出弹出框,创建多个这样的按钮后,点击右键忘记关闭弹出框,又去在另一个按钮的右键上点击,这样会在同一时刻出多个弹出框的问题,使同一时刻只有一个弹出框显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

navicat and connection is being used

1、在已经保存的连接上上编辑,测试连接成功,但是点击连接就会一直提示 connection is being used 2、需要新建一个连接,才能使用,不能再已保存的上面修改

以人为本、用“简”驭“繁”……统统都是新华三物联网的关键词儿!

戳蓝字“CSDN云计算”关注我们哦!极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!初见2019 Navigate领航者峰会的展区,就被这个接地气的大屏幕吸引了…

我们应聘BAT等互联网公司,关于Spring到底需要掌握什么?

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!阅读本文大概需要 3 分钟。之前分享过一些BAT面试必会的文章,一些读者看了…

java.lang.reflect.InvocationTargetException 的惨痛教训

记录发布webservice漏发内部类文件导致异常java.lang.reflect.InvocationTargetException 的惨痛教训 我的一个实现类中调用了一个内部类,在本地测试正常,发布服务期之后,soapUI共测试报 java.lang.reflect.InvocationTargetException &…

qt下实现文件的拖拽打开

引言 此文用于记录按下鼠标左键不放,拖动文件到程序中打开。该示例中只设置了可以拖动的文件类型为.h,.cpp,.txt这三种文件类型。 程序运行的效果: 示例 下面是具体的实现。 项目的结构: 具体的实现代码,如下: mai…

Java并行流 No thread-bound request found

异常如下: java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operati…

qt中使用QCompleter实现查找功能

引言 本文有两个例子,示例一中通过在combox中输入文本可以实现自动补全,用户根据提示列表,选中某一个信息,作为要搜索的字符串。示例二中用户输入要搜索的文本在行编辑器中,当输入的文本在搜索的字符串列表中时&#…

动图:程序员才懂的这些!

戳蓝字“CSDN云计算”关注我们哦!1. Java VS C2. 功能先上了再说3.高级开发人员作为一个团队进行编程4. 调试CSS5. 编译错误:括号不匹配6.高级开发人员重构代码7. 看实习生编码的时候,我的表情...8.当我尝试进入BIOS9. 虽然很多Bug&#xff0…

MyBatisPlus_查询篇_入门试炼_01

文章目录1、数据库 Schema 脚本如下:2、数据库 Data 脚本:3. 实战现有一张 User 表,其表结构如下:idnameageemail1Jone18test1gblfy.com2Jack20test2gblfy.com3Sandy28test3gblfy.com4Jone21test4gblfy.com5Billie24test5gblfy.co…

表达祝福与喜悦的数字资产——平安夜的特别礼物华为云DAC

平安夜的街灯光闪烁,人们沉浸在节日气氛中,忙着购买礼物,准备晚餐,相互传递感恩与祝愿。华为云DAC数字资产创意平台锁住美好,用数字艺术的形式制作专属节日记忆,有创意的礼物总让人难忘。 独一无二的礼物—…

qt生成无ui界面动态库,有ui界面的动态库,以及含有资源文件和qss文件的动态库

提要 此文分别就qt生成纯代码的动态库,含有ui文件的动态库以及含有资源文件qss文件和切图的动态库。 实现 1.纯代码的生成qt库。即没有ui文件的项目。 打开QtCreate,新建文件,选择library. 接下来填写项目的名称,选择生成的路…

太形象了!什么是边缘计算?最有趣的解释没有之一!

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!云计算就像是天上的云,看得见摸不着,像章鱼的大脑,…

qt中使窗口的大小随窗口的内容大小进行调整

提要 窗口用于显示文本信息,当窗口的文本信息变长,原有窗口的大小不足以显示文本信息。这时就需要一个能够根据窗口要显示的文本信息的长度来调整窗口大小的窗口。 示例 效果图: 窗口内容少的时候提示窗口大小,当窗口要显示的…

MyBatisPlus_查询分页篇_入门试炼_02

文章目录1. mapper接口2. 映射文件3. 实战分页1. mapper接口 package com.gblfy.springboot.mybatisplus.mapper;import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.…

看完这篇买车不用坐引擎盖哭啦

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!作者:Kying转自:数据森麟作者介绍:Kying&#xff0…

Qt关闭程序的时候创建json文件,再次启动时重新加载到界面上

提要 当程序关闭后再次打开程序需要加载上一次的按钮名称设置。 思路 关闭程序的时候保存此刻界面按钮的文本,正常情况下只需在程序退出时调用的析构函数的内部实现,将界面所有的按钮文本生成一个文件,在程序下一次启动的时候,…

MyBatis-Plus_快速入门0222

文章目录一、配置1.1、Spring Boot 工程:配置 MapperScan 注解1.2 Spring MVC 工程:配置 MapperScan1.2.1 调整 SqlSessionFactory 为 MyBatis-Plus 的 SqlSessionFactory一、配置 MyBatis-Plus 的配置异常的简单,我们仅需要一些简单的配置即…

什么是云计算基础设施? | 技术头条

戳蓝字“CSDN云计算”关注我们哦!技术头条:干货、简洁、多维全面。更多云计算精华知识尽在眼前,get要点、solve难题,统统不在话下!云计算基础设施是内部系统和公共云之间的软件和硬件层,其融合了许多不同的…

如何将本地代码推送至远程仓库_命令简化版本

如何将本地代码推送至远程仓库? 文章目录一、新仓库1. 初始化README.md2. 初始化Git仓库3. 将工作区的代码添加至暂存区4. 将暂存区的变更文件提交到本地仓库5. 将本地仓库和远程仓库建立连接6. 将本地代码push至远程仓库7. 先拉去代码,在push8. 强制推送…

K8S精华问答 | Kubernetes用的是Docker的容器?

kubernetes,简称K8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,目标是让部署容器化的应用简单并且高,并提供了应用部署,规划,更新,维护的一种机制。今天,我们就来看看…