Qt实现弹出窗口,点击其他位置消失

Qt实现弹出窗口,点击其他位置消失

一开始时想的很美好,写button的点击事件,然后在弹窗界面中写eventFilter(QEvent *e)事件

1
2
3
4
5
6
7
8
if (event->type() == QEvent::ActivationChange)
{
if(QApplication::activeWindow() != this)
{
this->close();
}
}
return QWidget::event(event);

但是这样写发现一个问题,当我想实现点击按钮也可以关闭dialog时,不行了,因为EventFilter是第一触发事件,当我点按钮是,判断当前的活动窗口不是dialog,他先关闭,然后触发按钮的点击事件,再打开了dialog。很麻烦。

后来有了解到Qt有一个popup的属性

1
info->setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);

这样设置了之后,窗口是无边框且是点击其他位置关闭,但是还是会有上面的问题,没解决。

再后来,在一篇blog中看到了Qt::WA_NoMouseReplay属性
机翻一下:用于弹出窗口小部件。指示在弹出小部件关闭时不应重播最近的鼠标按下事件。该标志由小部件的作者设置,并在小部件每次接收到新的鼠标事件时由Qt内核清除。
大意就是它会拦截鼠标事件不会传递,专用于弹窗事件。
呜呜呜,原来Qt早就搞定了这个事件,找了半天,还是Qt不熟悉。
具体使用,在弹出的窗口里重写mousePressEvent(QMouseEvent *e)事件:

1
2
3
4
5
void InfoDialog::mousePressEvent(QMouseEvent *e)
{
setAttribute(Qt::WA_NoMouseReplay);
QDialog::mousePressEvent(e);
}

Qt实现弹出窗口,点击其他位置消失

http://tux.red/2023/08/06/Qt/qt-pop-dialog/

作者

redtux

发布于

2023-08-06

更新于

2023-08-06

许可协议

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.