Qt::popup是如何实现点击外面自动关闭的
时间: 2024-05-14 15:18:47 浏览: 164
Popup例子 实现弹出窗口的关闭
5星 · 资源好评率100%
在 Qt 中,弹出窗口(Popup)是通过 QPopupWindow 类来实现的。QPopupWindow 类继承自 QWidget 类,因此它可以像普通窗口一样显示和隐藏。
QPopupWindow 中实现了鼠标按下事件和事件过滤器来实现点击外部区域自动关闭的功能。具体来说,当弹出窗口显示时,它会在 QApplication 中安装一个事件过滤器,用于监听所有鼠标事件。当用户按下鼠标时,QPopupWindow 会检查鼠标位置是否在窗口外部,如果是,则会发出关闭信号,隐藏窗口。
以下是一个简单的示例代码,演示如何使用 QPopupWindow 类来实现点击外部自动关闭的弹出窗口:
```cpp
#include <QApplication>
#include <QMouseEvent>
#include <QPopupWindow>
#include <QLabel>
#include <QDebug>
class PopupWindow : public QPopupWindow
{
public:
PopupWindow(QWidget *parent = nullptr)
: QPopupWindow(parent)
{
QLabel *label = new QLabel("Hello, World!", this);
label->setAlignment(Qt::AlignCenter);
setWidget(label);
}
protected:
bool eventFilter(QObject *object, QEvent *event) override
{
if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
if (!rect().contains(mouseEvent->pos())) {
hide();
return true;
}
}
return QPopupWindow::eventFilter(object, event);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
PopupWindow popup;
popup.setGeometry(100, 100, 200, 100);
popup.show();
return app.exec();
}
```
在上面的示例代码中,我们创建了一个 PopupWindow 类,它继承自 QPopupWindow 类。在 PopupWindow 类的构造函数中,我们创建了一个 QLabel,用于显示文本内容,并将其设置为窗口的子控件。在 PopupWindow 类中,我们重写了 eventFilter() 函数,用于过滤鼠标事件。当用户按下鼠标时,我们检查鼠标位置是否在窗口外部,如果是,则发出关闭信号,隐藏窗口。在主函数中,我们创建了一个 PopupWindow 对象,设置它的位置和大小,并显示出来。
阅读全文