Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: vintik от Апрель 10, 2013, 18:32



Название: Скрытие кнопок window title (или запрет их работы)
Отправлено: 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))
Видимо, я чего-то не догоняю, наставьте на путь истинный.

                                                                                                                                            Спасибо


Название: Re: Скрытие кнопок window title (или запрет их работы)
Отправлено: Old от Апрель 10, 2013, 18:36
Если пробовать игнорить события QEvent::WindowStateChang или QEvent::Hide, толку никакого - виджет сначала скрывается а потом только попадаю в обработчики события (причём неважно будь то event, changeEvent или fllterEvent (это в случае, если на виджет сделать installEventFilter))
Окно сворачивает оконный менеджер, приложение об этом только уведомляется! Тут нужно разбираться с вашем оконным менеджером.


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


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

Почему так же нельзя сделать со сворачиванием?
Мне кажется должна быть какая-то возможность до передачи евента оконному менеджеру отловить его...


Название: Re: Скрытие кнопок window title (или запрет их работы)
Отправлено: vintik от Апрель 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);
}

Ну что происходит понятно, при нажатии на злополучную кнопку - окно сворачивается. Об этом приходит евент и мы тут же окно разворачиваем


Название: Re: Скрытие кнопок window title (или запрет их работы)
Отправлено: Bepec от Апрель 10, 2013, 19:52
Апи системы используй. Тут по другому никак, вроде. Под винду бы подсказал, там пара строк, а вот никсы для меня темень и мракобесие.