LINUX.ORG.RU

определить z-order окна

 


0

1

Допиливаю тут под себя понемногу Trojita. В ней по нажатию на значок в трее окно сворачивается или показывается. Хочется сделать чтобы когда окно на экране, но закрыто другими окнами, оно при нажатии на значок в трее «выдвигалось» на передний план вместо сворачивания.

isVisible() у QWindow можно определить есть ли вообще окно на экране, а вот isActiveWindow() на который я надеялся, ничего мне не дает. Возможно так происходит потому что при нажатии на значок в трее фокус у окна теряется.

Подскажите как можно определить z-order окон расположенных на рабочем столе. Или определить перекрывается ли окно другими окнами.

Делать костыли с сохранением когда и как происходила потеря фокуса не хочется(хотя возможно и придется).

★★★★★

Ответ на: комментарий от m0rph

Dependencies Qt 5, no other framework required

QT += KWindowSystem

Не пойму, ему чистого Qt5 хватит или нет?

Жаль конечно что в венде не будет работать эта фишка. Trojita все таки кроссплатформенная софтина. Хочется все таки и с апстримом делится наработками, а при сломанной кроссплатформе думаю не примут.

Loki13 ★★★★★
() автор топика
Ответ на: комментарий от Loki13

Хочется все таки и с апстримом делится наработками, а при сломанной кроссплатформе думаю не примут.

Если честно, то описанное поведение не стандартно, и далеко не факт, что примут даже кроссплатформенно.

CrossFire ★★★★★
()

В порядке бреда

А проверять, активно ли окно и переопределять действие по клику на значок - не вариант?

Типа, если окна нет - однозначно «показать», если окно активно - однозначно «свернуть», если окно есть, но неактивно - «на передний план»?

Я такое на венде костылить пытался через Autohotkey, но подзабил

dhameoelin ★★★★★
()
Последнее исправление: dhameoelin (всего исправлений: 1)
Ответ на: комментарий от CrossFire

Если честно, то описанное поведение не стандартно, и далеко не факт, что примут даже кроссплатформенно.

Ну это согласен. Я вообще хотел выделить свои «фишки» в виде tweaks и в отдельный таб в настройках засунуть. Чтобы как TabMixPlus получился, но для Trojita. Захотел «фишку» - поставил галочку, не захотел - не поставил.

Loki13 ★★★★★
() автор топика
Ответ на: В порядке бреда от dhameoelin

А проверять, активно ли окно и переопределять действие по клику на значок - не вариант?

Надо будет попробовать. Пока что столкнулся с проблемой, что focusOutEvent не приходит к QWindow. Пока что не понял почему.

В данный момент нашел Qt::ApplicationInactive

The application is visible, but not selected to be in front. On desktop platforms, this typically means that the user activated another application.

Похоже то что надо, буду пробовать.

Loki13 ★★★★★
() автор топика
Ответ на: комментарий от Loki13

Похоже то что надо

Исходя из приведённого тобой описания - как раз нужный вариант.

буду пробовать

Держи нас в курсе. Вот, без подначек.

dhameoelin ★★★★★
()
Ответ на: комментарий от dhameoelin

Вот такой код работает как надо. Всем спасибо.

if(isVisible() && QGuiApplication::applicationState() == Qt::ApplicationInactive)
        {
            activateWindow();
        }
        else
        {
            setVisible(!isVisible());
            if (isVisible())
                showMainWindow();
        }

Так намного удобнее пользоваться сразу стало. Ещё осталось десяток твиков. Если в апстрим не возьмут потом, то думаю на гитхабе где-нибудь положу в виде патчей.

Loki13 ★★★★★
() автор топика
Последнее исправление: Loki13 (всего исправлений: 2)
Ответ на: комментарий от dhameoelin

setVisible(!isVisible()); <-WAT?

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

А вообще тут думаю смысл в том что окно скрывается\показывается по нажатию на значок в трее. И setvisible делает его видимым, но в позиции когда оно скрывалось, а showMainWindow приносит его уже на первый план. Что-то мне лень все это проверять. Работает и ладно :)

Loki13 ★★★★★
() автор топика
Ответ на: комментарий от Loki13

Этот кусок мне тоже показался странным, но он мне достался в наследство.

То есть, этот артефакт от разработчиков?

Работает и ладно

Не очень правильная позиция, если уж ты патчи в апстрим засылать собрался...

dhameoelin ★★★★★
()
Ответ на: комментарий от dhameoelin

То есть, этот артефакт от разработчиков?

Да, я добавил только условие сверху.

Не очень правильная позиция, если уж ты патчи в апстрим засылать собрался...

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

Loki13 ★★★★★
() автор топика
Ответ на: комментарий от dhameoelin

setVisible(!isVisible()); <-WAT?

И? Банальная переключалка. Если видимо (isVisible() == true) – то скрыть, если невидимо (isVisible() == false) – то показать.

Stil ★★★★★
()
Ответ на: комментарий от Loki13

поскольку так было сделано разрабами, то буду думать что не просто так.

Наверное, ты прав.

Stil, оно как костыль выглядит, имхо...

dhameoelin ★★★★★
()
Ответ на: комментарий от dhameoelin

оно как костыль выглядит, имхо...

Если заменить showMainWindow(); на activateWindow(); то получится совсем другая картина, а работать будет так же.

Loki13 ★★★★★
() автор топика
Ответ на: комментарий от dhameoelin

Гм. А корректнее как?

Гы

void MainWindow::showMainWindow()
{
    setVisible(true);
    activateWindow();
    raise();
}

Собственно у них там масло-маслянное, setVisible(true); вызывается 2 раза при показе окна.

Вот так можно переписать, чтобы нормально(более-менее) было:

if (isVisible())
                setVisible(false);
            else
                showMainWindow();
Loki13 ★★★★★
() автор топика
Последнее исправление: Loki13 (всего исправлений: 2)
Ответ на: комментарий от Loki13

Лол. Видимо, они ОЧЕНЬ хотели, чтобы программа, таки, вышла на передний план.

dhameoelin ★★★★★
()
Ответ на: комментарий от EXL

А у них — это у кого?

У них, это у разработчиков Trojita.

Читал нить, так и не понял, откуда ты взял сниппет.

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

Loki13 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.