QWidget监听其他QWidgets事件

时间:2018-06-13 12:54:18

标签: c++ qt qt5

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

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

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

所以问题是一个小部件如何对另一个小部件事件做出反应? 在我的情况下如何在调整其父级的大小时通知通知小部件? 我忘了提到我不希望MainWindow小部件知道有关此通知小部件的任何信息。通知小部件可以自行管理。你只需要调用类似new Notification(parent)的内容,它就会自行完成它的工作

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

1 个答案:

答案 0 :(得分:4)

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

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;
}