Как узнать, скрыт ли мой виджет другим приложением или виден ли он пользователю?

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

Есть ли способ узнать, виден ли виджет пользователю? Например, если у вас запущено два приложения, которые видны пользователю (очевидно, только одно из них имеет фокус и активно), но оба видны

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

А вообще хотелось бы узнать, есть ли способ узнать "виден ли виджет пользователю или нет".

Спасибо за любые предложения и альтернативы.


person blueskin    schedule 31.08.2011    source источник
comment
У меня нет правильного ответа, но я считаю, что isVisible все еще может быть истинным, даже если виджет скрыт от пользователя, пока виджет все еще доступен родителю.   -  person Nicholas Smith    schedule 01.09.2011
comment
да, но я хочу знать, не затенен ли виджет другим приложением.   -  person blueskin    schedule 01.09.2011
comment
В этом и заключается загвоздка, вам, вероятно, нужно смотреть, как приложение запускает QEvents, и переопределять стандартное поведение, если это приложение с одним окном, вы, вероятно, могли бы использовать applicationActivate и Deactivate, но вам, вероятно, придется сделать много шагов Работа.   -  person Nicholas Smith    schedule 01.09.2011


Ответы (3)


Я думаю, что это ожидаемое поведение, поскольку оконный менеджер (если я не ошибаюсь) должен рисовать окна в соответствии с их положением, z-индексом... Так что библиотека Qt не имеет к этому никакого отношения.

Если вы контролируете, когда отображается это другое приложение, вы можете скрыть древовидный виджет вручную и показать его снова, когда закроете другое приложение?

В противном случае вы должны попытаться улучшить свой виджет, и если вам нужна помощь, вы должны дать нам код :)

person ixM    schedule 31.08.2011
comment
Я не могу избежать древовидного виджета, а операция setText определенно занимает много времени, поэтому я не вижу больших возможностей для улучшения. Единственная оптимизация, которую я оставил, — это отключение обновления древовидного виджета, когда он не виден «пользователю». Помимо проблемы с древовидным виджетом, я хочу знать, действительно ли виджет виден «пользователю». - person blueskin; 31.08.2011

Пробовали ли вы QWidget::isActiveWindow()

person KaZ    schedule 01.09.2011
comment
это только для того, чтобы узнать, имеет ли окно фокус или нет. то есть, если у вас есть виджет и какое-то другое приложение рядом, и вы выбираете другое приложение, даже если виджет виден пользователю, он не активен. - person blueskin; 01.09.2011

Возможно, вы хотите что-то, что связано с фокусом.

http://doc.qt.io/archives/qt-4.7/qwidget.html#focus-prop

person kechap    schedule 01.09.2011
comment
Нет, у него такое же поведение, как у ActiveWindow. Если у вас открыто два приложения, и оба они видны пользователю, то только одно из них имеет значение «фокус». Я пробовал "QApplication::focusWidget()", "QWidget::hasfocus" не решает проблему - person blueskin; 01.09.2011
comment
Если это не работает, вам нужно создать подкласс QApplication. QApplication имеет сигнал focusChanged, и это означает, что у вас есть лучший контроль. Вы просто проверяете, испускается ли сигнал в пользовательском слоте, и включаете или отключаете определенные функции. - person kechap; 01.09.2011
comment
Даже если фокус изменен, все приложение может оставаться видимым или находиться за другим приложением. Я не думаю, что QApplication знал бы об этом. - person blueskin; 01.09.2011
comment
Я думаю, что вы не можете найти чистое решение. Либо вам нужно переосмыслить эту функциональность, либо придумать что-то еще, что вызовет функциональность, которую вы хотите реализовать. - person kechap; 01.09.2011
comment
Ага, похоже. Я посмотрю, смогу ли я найти обходной путь. Спасибо, месскех. - person blueskin; 01.09.2011