Qt Предотвратить скрытие QDialog - PullRequest
1 голос
/ 25 февраля 2020

В моем приложении windows у всех есть контекстное меню QDialog для настроек и т. Д. c, доступное по щелчку правой кнопкой мыши. В одном из этих диалоговых окон мы хотим отобразить всплывающее окно (QMessageBox), предупреждающее пользователя о действии, но Qt разрешает только диалоговое окно сразу, когда открывается новое, текущее скрыто. Они также скрыты, когда теряют фокус и c, что мне необходимо поддерживать.

Я просматривал фильтры событий , которые можно использовать для захвата события Hide но я не могу остановить шкуру на самом деле. Кажется, что ни комбинация возврата true, ни установка accept на событие не имеют никакого эффекта.

bool windowSettings::eventFilter(QObject *object, QEvent *event)
{
    if (object == this && event->type() == QEvent::Hide) {
        QHideEvent *hideEvent = static_cast<QHideEvent *>(event);
        hideEvent->accept();    //Should tell further event calls it has already been dealt with
        return true;    //Should indicate event has been dealt with

    }
    return false;
}

Контекстное меню - это фактически пользовательская реализация QDialog (назовем его myQDialog). Поэтому я попытался переопределить функцию hide() и добавить bool preventHiding, которая использовалась в новой функции скрытия, чтобы определить, должен ли диалог быть на самом деле скрытым. Вызов hide(); напрямую приводит к вызову переопределенной функции, но отображение окна подтверждения или щелчка за пределами диалогового окна по-прежнему вызывает событие скрытия, но не переопределенную функцию. (Я попробовал это с и без фильтра событий, присутствующего в коде).

Вместо этого я переопределил setVisible(), который вызывается из show / hide. Это вызывается последовательно, и моя реализация ниже не позволяет диалоговому окну закрыться, но я не могу щелкнуть окно сообщения, несмотря на то, что оно по-прежнему отображается поверх исходного диалога.

void myQDialog::setVisible(bool visible)
{
    if(preventHide)
    {
        //Don't hide
    }
    else
    {
        QDialog::setVisible(visible);
    }
}

Есть ли способ или захватить и остановить даже скрытие, или продолжать показывать исходное диалоговое окно, все еще имея возможность взаимодействовать с окном сообщения, которое оно создает?

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Вы можете просто сделать окно сообщений всплывающим, это просто!

Когда вы создаете окно сообщений, присвойте ему флажок окна, как показано ниже:

msgBox.setWindowFlags(Qt::WindowType::Popup);

Это будет означать это не окажет никакого влияния на окно позади.

Документы можно найти здесь

0 голосов
/ 26 февраля 2020

Может быть, вы можете посмотреть на эту часть WindowModality , которая, кажется, позволяет вам управлять вводом в различных windows (диалоговых окнах)

...