LINUX.ORG.RU

Метод event() получает далеко не все события. Почему?

 ,


0

1

Имею класс ExecuteCommand, расширенный от QDialog.

Переопределил в нем метод event():

// Переопределенный метод, вызываемый при обработке событий
bool ExecuteCommand::event(QEvent *event)
{
  qDebug() << "ExecuteCommand::event:" << event->type();

  if(event->type()==QEvent::Close)
  {
    qDebug() << "Emit signal dialogHide";
    emit dialogHide();
  }

  return QDialog::event(event);
}


Когда создается окно, работает, и закрывается, в логе видны только три события, при начале создания окна:

21:23:51 [DBG] ExecuteCommand::event: 74
21:23:51 [DBG] ExecuteCommand::event: 75
21:23:51 [DBG] ExecuteCommand::event: 170


И все.

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

★★★★★

Ответ на: комментарий от annulen

Попробовал, та же песня:

void ExecuteCommand::closeEvent(QCloseEvent *event)
{
  qDebug() << "ExecuteCommand::closeEvent";
  QDialog::closeEvent(event);
}


При закрытии окна в логе тишина.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

А как ты окно закрываешь? «крестиком» WM?

annulen ★★★★★
()

Насколько я помню CloseEvent событие посылается не окном (как собственно и все друние события) а окружением - тоесть запрос на закрытие окна (при нажатии Alt+F4 или при нажатии на крестик на рамке окна). И уже при получении этого сообщения окно решает закрываться ему или нет.

Если же окно убирается с экрана какимто другим способом (закрывает само себя по нажатию на кнопку OK, или ему делается HIDE, или просто уничтожается) то никаких «CloseEvent» не будет.

zaz ★★★★
()
Ответ на: комментарий от pon4ik

Ну у меня только одно похожее место есть:

bool MainWindow::eventFilter( QObject *o, QEvent * e )
{
  // Отлавливание потери фокуса
  if(o==this && e->type() == QEvent::WindowDeactivate)
  {
    qDebug() << "Main window focus deactivate, save all state.";
    saveAllState();
  }

  return false; // Продолжать оработку событий дальше
}  


С ним проблем никогда не было.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от zaz

Если же окно убирается с экрана какимто другим способом (закрывает само себя по нажатию на кнопку OK, или ему делается HIDE, или просто уничтожается) то никаких «CloseEvent» не будет.

Вот я и хочу через event() отловить хотя бы hide.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Утверждать не буде, но если ктото просто в коде сделает delete pDialog; или pDialog->close(); то никаких эвентов вы не отловите.

zaz ★★★★
()
Ответ на: комментарий от pon4ik

Хотя, судя по доке это не должно быть критично, для QMainWindow.

pon4ik ★★★★★
()
Ответ на: комментарий от Xintrea

Ты меняешь поведение базового класса для всех вариантов использования, хотя, унаследованная реализация от тебя сокрыта.

Банально смотрим пример, дядьки из digia плохого не посоветуют.

pon4ik ★★★★★
()
Ответ на: комментарий от Xintrea

Напиши хеллоуворлд без кучи своего кода, вот и узнаешь. Насколько я помню, всё работало, для всех виджетов.

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

Ты меняешь поведение базового класса для всех вариантов использования, хотя, унаследованная реализация от тебя сокрыта.

Не распарсил.

На всякий случай заменил return false на:

return QMainWindow::eventFilter(o, e);


Толку никакого.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от pon4ik

Напиши хеллоуворлд без кучи своего кода, вот и узнаешь. Насколько я помню, всё работало, для всех виджетов.

Написал, похоже работает.

Из-за чего в реальном коде могут не долетать события?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Не распарсил.

Notice in the example above that unhandled events are passed to the base class's eventFilter() function, since the base class might have reimplemented eventFilter() for its own internal purposes.

Толку никакого.

Хеллоу ворлд написал? Понял чем close от done и прочих отличается?

Я вот вспомнил, написал, но тебе ничего не расскажу:)

pon4ik ★★★★★
()
Ответ на: комментарий от Xintrea

События вещь такая...

Любой компонент может поставить фильтр, притом и из вне твоей проги(как минимум под виндой).

Если больше нет твоих фильтров, отключай последовательно код, пока не заработает.

Расскажи лучше решаемую задачу.

pon4ik ★★★★★
()
Ответ на: комментарий от zaz

Вообщето судя по вашему логу это окно и не открывалось никогда (нету 17 эвента SHOW)

Все, теперь разобрался. Я нетрадиционно использовал наследника QDialog, который сам не открывается как окно, а открывает другой QDialog. Это нужно было чтоб управляться с основным циклом (у меня там эмулятор консоли).

Xintrea ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.