Russian Qt Forum
Октябрь 01, 2024, 00:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Окно, которое само закрывается при клике за его пределы.  (Прочитано 4815 раз)
serkol
Гость
« : Декабрь 12, 2010, 22:55 »

Есть окно (немодальный диалог), которое должно само закрываться, если пользователь кликнул куда-нибудь за его пределы. Как это сделать?
Записан
crossly
Гость
« Ответ #1 : Декабрь 13, 2010, 00:22 »

отловить focusOutEvent и закрыть....
Записан
serkol
Гость
« Ответ #2 : Декабрь 13, 2010, 00:36 »

focusOutEvent какого виджета? focusOutEvent диалога никогда не вызывается. И вообще, на некоторых диалогах нет ни одного виджета, который может быть в "фокусе" (например когда на окне диалога только QLabel)
Записан
crossly
Гость
« Ответ #3 : Декабрь 13, 2010, 00:42 »

Цитировать
focusOutEvent диалога никогда не вызывается.
с чего вдруг??
Записан
serkol
Гость
« Ответ #4 : Декабрь 13, 2010, 00:54 »

А что, должен вызываться? Вы теоретизируете, или у вас на самом деле вызывается?

Я добавил метод в диалог:

Код:
void DlgHtmlMessage::focusOutEvent ( QFocusEvent * event ) {
    close();
}

поставил на него breakpoint - он никогда не вызывается, куда бы я ни кликал, хоть на другое окно программы, хоть на десктоп, хоть на другую программу.
Записан
serkol
Гость
« Ответ #5 : Декабрь 13, 2010, 02:31 »

Наверное не самый элегантный способ, но работает.

Окно, которое должно закрыться при клике вне его границ, должно отловить событие QEvent::WindowDeactivate

Как нормально отлавливать это событие, мне не совсем ясно (я новичок в Qt). Я использовал installEventFilter

Код:
    this->installEventFilter(this);

Код:
bool DlgHtmlMessage::eventFilter(QObject *obj, QEvent *event) {
    if (event->type() == QEvent::WindowDeactivate) {
        close();
        return true;
    }
    return QObject::eventFilter(obj, event);
}
Записан
fuCtor
Гость
« Ответ #6 : Декабрь 13, 2010, 07:56 »

Можно переопределить метод event и из фильтра перенести в него все.
Записан
serkol
Гость
« Ответ #7 : Декабрь 13, 2010, 08:20 »

@fuCtor: спасибо! Я почему-то не мог подумать что базовый класс (QObject) еще и события обрабатывает :-)
Записан
SABROG
Гость
« Ответ #8 : Декабрь 13, 2010, 12:02 »

Такой еще вариант:

Код
C++ (Qt)
   QStateMachine* machine = new QStateMachine(this);
   QState* s1 = new QState(machine);
 
   QEventTransition* evTrans =
           new QEventTransition(this, QEvent::WindowDeactivate);
   evTrans->setTargetState(s1);
 
   s1->addTransition(evTrans);
   connect(evTrans, SIGNAL(triggered()), SLOT(close()));
 
   machine->setInitialState(s1);
   machine->start();
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 18.