首页 > 解决方案 > QWidget 监听其他 QWidgets 事件

问题描述

为了解释这种情况,我有一个 QMainWindow 里面有很多东西。我的目标是在此窗口的右下角制作某种通知。
通知小部件必须在所有其他小部件之上。

到目前为止,我已经创建了继承自 QWidget 的 Notification 小部件。通过将 QMainWindow 设置为其父级,我将它“浮动”在所有其他小部件之上。它不属于任何布局。现在最大的问题是让它粘在右下角。我设法手动放置它,但我现在想要的是在调整大小事件时移动它。

不幸的是,由于它不属于任何布局,它没有收到任何 resizeEvent,所以我不能重载 resizeEvent() 函数。一个尝试是让 QMainWindow 在其 resizeEvent 方法中发出一个信号,但我对这种方法并不满意。特别是因为在 Notification 小部件构造函数中我有 this connect(static_cast<MainWindow*>(parent), &MainWindow::resized, this, &Notification::update_position);,它有点破坏小部件的通用性,因为它的父级必须是 MainWindow 小部件。

所以问题是一个小部件如何对另一个小部件事件做出反应?在我的例子中,当它的父级被调整大小时,如何通知通知小部件? 而且我忘了提到我不希望 MainWindow 小部件知道有关此通知小部件的任何信息。通知小部件可以自行管理。你只需调用类似的东西new Notification(parent),它就会自己做它的事情

欢迎任何想法,在此先感谢:)

标签: c++qtqt5

解决方案


您可以将通知小部件安装为其父级的事件过滤器,例如:

NotificationWidget::NotificationWidget(QWidget *parent) : QWidget(parent) {
    parent->installEventFilter(this);
}

bool NotificationWidget::eventFilter(QObject *obj, QEvent *event) {
    // normal event handling
    bool ret = QObject::eventFilter(obj, event);

    if (event->type() == QEvent::Resize) {
        // Parent resized, adjust position
    }
    return ret;
}

推荐阅读