Как найти окно текущего документа в мультидокументном приложении Qt? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть приложение Qt, и я пытаюсь создать для него панель поиска. В приложении может быть открыто более одного окна документа (например, QMainWindow) одновременно. Я хочу, чтобы панель «Найти» работала с любым окном документа, расположенным впереди; давайте назовем это «текущим окном документа». Учитывая это окно, я могу получить его focusWidget() и работать с этим виджетом, если оно QTextEdit. Но как мне найти это окно?

Идея № 1 состоит в том, чтобы использовать QApplication::focusWidget() для непосредственного получения сфокусированного виджета; но так как моя панель «Поиск» имеет QLineEdit s внутри для поиска / замены текста, эти виджеты часто являются виджетом фокуса - но, очевидно, я не хочу делать поиск внутри них.

Идея # 2 должен использовать QApplication::activeWindow(), но это имеет тот же недостаток; Моя панель поиска часто является активным окном.

Идея № 3 состоит в том, чтобы l oop - QApplication::topLevelWidgets() найти первое окно, которое не скрыто и наследуется от QMainWindow. Это работает нормально - за исключением того, что этот список не хранится в порядке «спереди к спине», поэтому первое найденное окно-кандидат не обязательно является передним краем документа windows.

Так что же является правильным решением? Как я могу получить список виджетов верхнего уровня спереди назад, или определить, какой из двух виджетов верхнего уровня находится впереди, или как-то иначе найти переднее главное окно? Это должно быть как-то решаемо; это стандартная потребность для любого вида немодальной панели, которая работает с текущим документом, такой как инспектор (или панель «Найти»!). Но я не могу найти в Интернете ничего, показывающего, как это сделать.

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

...