c++ - 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)
,它就会自己做它的事情
欢迎任何想法,在此先感谢:)
解决方案
您可以将通知小部件安装为其父级的事件过滤器,例如:
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;
}