Russian Qt Forum
Июля 08, 2025, 03:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Popup-окно, как?  (Прочитано 7481 раз)
hordi1
Гость
« : Мая 30, 2011, 18:06 »

Приветствую

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

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

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

Qt-4.7.3

Спасибо
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Мая 30, 2011, 18:11 »

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

Qt 5.11/4.8.7 (X11/Win)
hordi1
Гость
« Ответ #2 : Мая 30, 2011, 18:13 »

хм, спасибо, попробую...
Записан
asvil
Гость
« Ответ #3 : Мая 30, 2011, 18:14 »

А вроде как отличненько метод close() в переопределенный focusOut(event) ложиться. Вы только создавайтесь просто без рамочки, а не как модельное окно.
Записан
hordi1
Гость
« Ответ #4 : Мая 30, 2011, 18:29 »

А вроде как отличненько метод close() в переопределенный focusOut(event) ложиться. Вы только создавайтесь просто без рамочки, а не как модельное окно.

focusOut для модального окна не ловится...
Записан
asvil
Гость
« Ответ #5 : Мая 31, 2011, 10:21 »

имел ввиду, а не как модальное окно, конечно же.
Записан
hordi1
Гость
« Ответ #6 : Мая 31, 2011, 14:21 »

А вроде как отличненько метод close() в переопределенный focusOut(event) ложиться. Вы только создавайтесь просто без рамочки, а не как модельное окно.

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

Записан
p166
Гость
« Ответ #7 : Июня 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 должен быть обязательно загружен менеджер окон.
« Последнее редактирование: Июня 01, 2011, 12:02 от p166 » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Июня 01, 2011, 12:27 »

Цитировать
Примечание: в Linux должен быть обязательно загружен менеджер окон.
В том-то и дело, что для таких окон не нужны декорации вообще и соответственно WM тоже.
Имхо, если лень писать обвязку ( отлов потери фокуса, нажатий, навеску грабов, да и того же Esc ) лучше QMenu, в котором всё это уже есть, нет.
Записан

Qt 5.11/4.8.7 (X11/Win)
hordi1
Гость
« Ответ #9 : Июня 01, 2011, 17:38 »

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

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

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Июня 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 );
}
 
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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