QWidget监听其他QWidgets事件

Waf*_*sys 1 c++ qt qt5

为了解释这种情况,我有一个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),它就会自己处理

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

kin*_*nak 5

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

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;
}
Run Code Online (Sandbox Code Playgroud)