提要
继承于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();}
}
上述就可以解决一个自定义按钮类,右键出弹出框,创建多个这样的按钮后,点击右键忘记关闭弹出框,又去在另一个按钮的右键上点击,这样会在同一时刻出多个弹出框的问题,使同一时刻只有一个弹出框显示。