qt 点击空白处弹窗消失,点击按钮弹窗出现或消失

主窗口 设置一个按钮pushButton:点击按钮弹出窗口,按钮为pressed。再次点击窗口隐藏,按钮释放。
至少需要两个函数

  1. 主窗口pushButton的槽函数 slot_on_pushButton_clicked(bool checked)
  2. 弹出窗口构造函数中加入:this->setWindowFlags(Qt::Popup);

这两个函数设置完毕,基本可以实现 点击按钮弹出窗口, 再次点击按钮窗口隐藏,点击空白处弹窗消失
但是会造成一个问题:

  1. 点击按钮弹出窗口,按钮为pressed
  2. 点击空白处弹窗消失,按钮为pressed
  3. 再次点击按,窗口不弹出,按钮释放
  4. 点击按钮弹出窗口,按钮为pressed

也就是说,有时候,按钮需要点击两次才会弹出窗口。

于是在,弹窗需要添加一个发射信号的函数,告诉主窗口弹窗隐藏了,可以把按钮恢复了

  1. 弹窗重写event(QEvent* event),当窗口隐藏时QEvent::HideToParent 发射信号给主窗口
  2. 主窗口 接受信号:如果鼠标不在按钮上,则恢复按钮(不判断的话,点击按钮弹窗无法隐藏)
//设置按钮可以点击
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);
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值