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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Скрытие кнопок window title (или запрет их работы)  (Прочитано 3099 раз)
vintik
Гость
« : Апрель 10, 2013, 18:32 »

Формулировка задачи следующая:
настроить виджет, так чтобы он был всегда поверх всех окон, у него нельзя было бы изменять размер, нельзя закрыть или скрыть.

У меня Kubuntu 12.10
До конца задачу решить не удалось. Перепробовал всякие разные советы, с разных форумов, в том числе и с нашего (тема поднималась).
Однако, не работает как надо.

Код:
setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowStaysOnTopHint);
layout()->setSizeConstraint(QLayout::SetFixedSize);

Такая связка позволяет сделать всё, кроме запрета сворачивания. (т.е. остаётся только эта кнопка в title bar)
Как скрыть эту кнопку - не знаю...
Бог с ним, со скрытием кнопки. Как её задизэйблить или сделать так, чтобы она не работала - тоже не знаю.

Если пробовать игнорить события QEvent::WindowStateChang или QEvent::Hide, толку никакого - виджет сначала скрывается а потом только попадаю в обработчики
события (причём неважно будь то event, changeEvent или fllterEvent (это в случае, если на виджет сделать installEventFilter))
Видимо, я чего-то не догоняю, наставьте на путь истинный.

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

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Апрель 10, 2013, 18:36 »

Если пробовать игнорить события QEvent::WindowStateChang или QEvent::Hide, толку никакого - виджет сначала скрывается а потом только попадаю в обработчики события (причём неважно будь то event, changeEvent или fllterEvent (это в случае, если на виджет сделать installEventFilter))
Окно сворачивает оконный менеджер, приложение об этом только уведомляется! Тут нужно разбираться с вашем оконным менеджером.
Записан
vintik
Гость
« Ответ #2 : Апрель 10, 2013, 18:49 »

Если пробовать игнорить события QEvent::WindowStateChang или QEvent::Hide, толку никакого - виджет сначала скрывается а потом только попадаю в обработчики события (причём неважно будь то event, changeEvent или fllterEvent (это в случае, если на виджет сделать installEventFilter))
Окно сворачивает оконный менеджер, приложение об этом только уведомляется! Тут нужно разбираться с вашем оконным менеджером.


Но ведь есть же возможность отловить событие закрытия виджета  и проигнорить его?
Код:
void some_widget::closeEvent(QCloseEvent *event)
{
    event->ignore();
}

Почему так же нельзя сделать со сворачиванием?
Мне кажется должна быть какая-то возможность до передачи евента оконному менеджеру отловить его...
Записан
vintik
Гость
« Ответ #3 : Апрель 10, 2013, 18:53 »

Методом научного тыка удалось подобрать костыльное решение.
Но идеалогически оно, имхо, неверно
В конструкторе делаем:

Код:
setWindowState(Qt::WindowMaximized);

и затем

Код:
void some_widget::changeEvent(QEvent *event)
{
    if (event->type() == QEvent::WindowStateChange)
    {
        if(QWindowStateChangeEvent *e = dynamic_cast<QWindowStateChangeEvent*>(event))
        {
            if(e->oldState() == Qt::WindowMaximized)
            {
                setWindowState(Qt::WindowMaximized);
                return;
            }
        }
    }
    QWidget::changeEvent(event);
}

Ну что происходит понятно, при нажатии на злополучную кнопку - окно сворачивается. Об этом приходит евент и мы тут же окно разворачиваем
Записан
Bepec
Гость
« Ответ #4 : Апрель 10, 2013, 19:52 »

Апи системы используй. Тут по другому никак, вроде. Под винду бы подсказал, там пара строк, а вот никсы для меня темень и мракобесие.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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