主窗口 设置一个按钮pushButton:点击按钮弹出窗口,按钮为pressed。再次点击窗口隐藏,按钮释放。
至少需要两个函数
- 主窗口pushButton的槽函数 slot_on_pushButton_clicked(bool checked)
- 弹出窗口构造函数中加入:this->setWindowFlags(Qt::Popup);
这两个函数设置完毕,基本可以实现 点击按钮弹出窗口, 再次点击按钮窗口隐藏,点击空白处弹窗消失
但是会造成一个问题:
- 点击按钮弹出窗口,按钮为pressed
- 点击空白处弹窗消失,按钮为pressed
- 再次点击按,窗口不弹出,按钮释放
- 点击按钮弹出窗口,按钮为pressed
也就是说,有时候,按钮需要点击两次才会弹出窗口。
于是在,弹窗需要添加一个发射信号的函数,告诉主窗口弹窗隐藏了,可以把按钮恢复了
- 弹窗重写event(QEvent* event),当窗口隐藏时QEvent::HideToParent 发射信号给主窗口
- 主窗口 接受信号:如果鼠标不在按钮上,则恢复按钮(不判断的话,点击按钮弹窗无法隐藏)
//设置按钮可以点击
ui->pushButton->setCheckable(true);
//定义槽函数
connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(slot_on_pushButton_clicked(bool)));
void mainWidget::slot_on_pushButton_clicked(bool checked)
{
if(!m_Wgt)
{
m_Wgt = new ConditionWidget(this);
//主窗口接受 弹窗隐藏的信号
connect(m_modelQueryConditionWgt, &ConditionWidget::SignalWidgetHide, this, &mainWidget::hideModelQueryConditionWgt);
}
if (checked)
{
//按下 窗口可见
m_Wgt ->show();
}
else
{
m_Wgt ->hide();
}
}
void mainWidget::hideModelQueryConditionWgt( )
{
if (m_Wgt != nullptr && ui->pushButton->isChecked() && !ui->pushButton->geometry().contains(this->mapFromGlobal(QCursor::pos())))
{
ui->pushButton->setChecked(false);
}
}
弹窗
ConditionWidget::ConditionWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
//点击空白处 弹窗隐藏
this->setWindowFlags(Qt::Popup);
}
bool ConditionWidget::event(QEvent* event)
{
if (event->type() == QEvent::HideToParent)
{
emit SignalWidgetHide();
}
return QWidget::event(event);
}