Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: serkol от Декабрь 12, 2010, 22:55



Название: Окно, которое само закрывается при клике за его пределы.
Отправлено: serkol от Декабрь 12, 2010, 22:55
Есть окно (немодальный диалог), которое должно само закрываться, если пользователь кликнул куда-нибудь за его пределы. Как это сделать?


Название: Re: Окно, которое само закрывается при клике за его пределы.
Отправлено: crossly от Декабрь 13, 2010, 00:22
отловить focusOutEvent и закрыть....


Название: Re: Окно, которое само закрывается при клике за его пределы.
Отправлено: serkol от Декабрь 13, 2010, 00:36
focusOutEvent какого виджета? focusOutEvent диалога никогда не вызывается. И вообще, на некоторых диалогах нет ни одного виджета, который может быть в "фокусе" (например когда на окне диалога только QLabel)


Название: Re: Окно, которое само закрывается при клике за его пределы.
Отправлено: crossly от Декабрь 13, 2010, 00:42
Цитировать
focusOutEvent диалога никогда не вызывается.
с чего вдруг??


Название: Re: Окно, которое само закрывается при клике за его пределы.
Отправлено: serkol от Декабрь 13, 2010, 00:54
А что, должен вызываться? Вы теоретизируете, или у вас на самом деле вызывается?

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

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

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


Название: решено
Отправлено: serkol от Декабрь 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);
}


Название: Re: Окно, которое само закрывается при клике за его пределы.
Отправлено: fuCtor от Декабрь 13, 2010, 07:56
Можно переопределить метод event и из фильтра перенести в него все.


Название: Re: Окно, которое само закрывается при клике за его пределы.
Отправлено: serkol от Декабрь 13, 2010, 08:20
@fuCtor: спасибо! Я почему-то не мог подумать что базовый класс (QObject) еще и события обрабатывает :-)


Название: Re: Окно, которое само закрывается при клике за его пределы.
Отправлено: SABROG от Декабрь 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();