В моем приложении 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);
}
}
Есть ли способ или захватить и остановить даже скрытие, или продолжать показывать исходное диалоговое окно, все еще имея возможность взаимодействовать с окном сообщения, которое оно создает?