Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: hordi1 от Мая 30, 2011, 18:06



Название: Popup-окно, как?
Отправлено: hordi1 от Мая 30, 2011, 18:06
Приветствую

Нужно создать окно, которое будет автоматом закрываться если кликнуть вне его области.
Попробовал установить флаги в конструкторе этого окна

setAttribute(Qt::WA_DeleteOnClose, true);
setWindowFlags(Qt::Popup),

но в итоге окно модальное и клики в другие области не работают... Есть ли какой простой метод кроме как городить велосипед с ивентами на потерю фокуса, координаты мыши и т.п.?
В двух словах  - окно должно работать как обычное контекстное меню например...

Qt-4.7.3

Спасибо


Название: Re: Popup-окно, как?
Отправлено: GreatSnake от Мая 30, 2011, 18:11
Цитировать
В двух словах  - окно должно работать как обычное контекстное меню например...
Ну и наследуйся от QMenu.
Содержимое добавляй через QWidgetAction.
Запускай через QMenu::exec().


Название: Re: Popup-окно, как?
Отправлено: hordi1 от Мая 30, 2011, 18:13
хм, спасибо, попробую...


Название: Re: Popup-окно, как?
Отправлено: asvil от Мая 30, 2011, 18:14
А вроде как отличненько метод close() в переопределенный focusOut(event) ложиться. Вы только создавайтесь просто без рамочки, а не как модельное окно.


Название: Re: Popup-окно, как?
Отправлено: hordi1 от Мая 30, 2011, 18:29
А вроде как отличненько метод close() в переопределенный focusOut(event) ложиться. Вы только создавайтесь просто без рамочки, а не как модельное окно.

focusOut для модального окна не ловится...


Название: Re: Popup-окно, как?
Отправлено: asvil от Мая 31, 2011, 10:21
имел ввиду, а не как модальное окно, конечно же.


Название: Re: Popup-окно, как?
Отправлено: hordi1 от Мая 31, 2011, 14:21
А вроде как отличненько метод close() в переопределенный focusOut(event) ложиться. Вы только создавайтесь просто без рамочки, а не как модельное окно.

Да, так получилось, только setFocus() нужно для него обязательно делать.
Используя QMenu также можно, но там добавляются все эти спецэффекты меню, типа плавное выезжание и т.п.



Название: Re: Popup-окно, как?
Отправлено: p166 от Июня 01, 2011, 12:00
Класс окна наследуем от виджета:
Код:
class QMngDev : public QWidget
{
    Q_OBJECT и т.д.

И отлавливаем событие WindowDeactivate:
Код:
bool QMngDev::event(QEvent *event)
{
    if (event->type() == QEvent::WindowDeactivate)
    {
        close();
        return true;
    }
    return QWidget::event(event);
}

Примечание: в Linux должен быть обязательно загружен менеджер окон.


Название: Re: Popup-окно, как?
Отправлено: GreatSnake от Июня 01, 2011, 12:27
Цитировать
Примечание: в Linux должен быть обязательно загружен менеджер окон.
В том-то и дело, что для таких окон не нужны декорации вообще и соответственно WM тоже.
Имхо, если лень писать обвязку ( отлов потери фокуса, нажатий, навеску грабов, да и того же Esc ) лучше QMenu, в котором всё это уже есть, нет.


Название: Re: Popup-окно, как?
Отправлено: hordi1 от Июня 01, 2011, 17:38
Цитировать
Примечание: в Linux должен быть обязательно загружен менеджер окон.
В том-то и дело, что для таких окон не нужны декорации вообще и соответственно WM тоже.
Имхо, если лень писать обвязку ( отлов потери фокуса, нажатий, навеску грабов, да и того же Esc ) лучше QMenu, в котором всё это уже есть, нет.

Так а что делать со спецеффектами меню? Не знаю как их отрубить, а плавный показ окна мне не нужен.


Название: Re: Popup-окно, как?
Отправлено: GreatSnake от Июня 01, 2011, 17:45
Так а что делать со спецеффектами меню? Не знаю как их отрубить, а плавный показ окна мне не нужен.
Код
C++ (Qt)
{
bool menu_is_animated = QApplication::isEffectEnabled( Qt::UI_AnimateMenu );
bool menu_is_faded = QApplication::isEffectEnabled( Qt::UI_FadeMenu );
 
if( menu_is_animated )
QApplication::setEffectEnabled( Qt::UI_AnimateMenu, false );
if( menu_is_faded )
QApplication::setEffectEnabled( Qt::UI_FadeMenu, false );
 
QMenu::exec();
 
if( menu_is_animated )
QApplication::setEffectEnabled( Qt::UI_AnimateMenu, true );
if( menu_is_faded )
QApplication::setEffectEnabled( Qt::UI_FadeMenu, true );
}