【问题标题】:QWidget listening to other QWidgets eventsQWidget 监听其他 QWidgets 事件
【发布时间】:2018-11-23 01:42:41
【问题描述】:

为了解释这种情况,我有一个 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) 的东西,它就会自行完成它的工作

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

【问题讨论】:

  • 一种方法是在QMainWindow 中做出反应,而不是知道需要更改大小的QWidget 是主窗口的子窗口,因此可以轻松找到它的指针。

标签: c++ qt qt5


【解决方案1】:

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

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

【讨论】:

  • 确实成功了。我忘了提到我尝试使用 eventFilter() 但我做错了。在通知小部件中,我正在执行installEventFilter(parent)。我一定对这个功能有误解。我会更详细地阅读文档。不过谢谢;)
猜你喜欢
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2021-02-20
  • 2015-06-23
相关资源
最近更新 更多