QWidget прослушивает другие события QWidget - PullRequest
0 голосов
/ 13 июня 2018

Чтобы объяснить ситуацию, у меня есть QMainWindow с множеством вещей внутри.Моя цель - сделать какое-то уведомление, которое появляется в правом нижнем углу этого окна.
Виджет уведомлений должен быть поверх всех остальных виджетов.

Пока что я создал этот виджет уведомлений, который наследуется от QWidget.Установив QMainWindow в качестве его родителя, я получил его «плавающим» поверх всех остальных виджетов. не относится ни к какому макету .Теперь большая проблема состоит в том, чтобы заставить это придерживаться нижнего правого угла.Мне удалось разместить его вручную, но сейчас я хочу переместить его на событие изменения размера.

К сожалению, поскольку он не принадлежит ни к какому макету, он не получает никакого resizeEvent, поэтому я не могу перегрузить функцию resizeEvent ().Была попытка заставить QMainWindow излучать сигнал в его методе resizeEvent, но я не очень доволен этим методом.Тем более, что в конструкторе виджетов Notification у меня есть этот connect(static_cast<MainWindow*>(parent), &MainWindow::resized, this, &Notification::update_position);, и он как бы нарушает универсальность виджета, поскольку его родительский должен быть виджетом MainWindow.

Так что вопрос в том, какодин виджет может реагировать на другое событие виджета?В моем случае здесь как можно уведомлять виджет уведомлений, когда его родительский элемент изменяется в размерах? И я забыл упомянуть, что не хочу, чтобы виджет MainWindow что-либо знал об этом виджете уведомлений.Виджет уведомлений может управляться самостоятельно.Вы просто называете что-то вроде new Notification(parent), и он будет делать свое дело самостоятельно

Любые идеи приветствуются, заранее спасибо:)

1 Ответ

0 голосов
/ 13 июня 2018

Вы можете установить виджет уведомлений в качестве фильтра событий для его родителя, например:

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