300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > qt自定义按钮类 每个按钮自带一个右键弹出框 如何使同一时刻只显示一个弹出框

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

时间:2020-05-22 19:32:41

相关推荐

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

提要

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

实现

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

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

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

intm_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();}}

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。