Название: Узнать имеет ли парент окно фокус Отправлено: Авварон от Июня 14, 2011, 13:33 Дано - есть куча виджетов класса А. Надо - узнать какой из них лежит на активном окне.
Думается что надо как-то так - хранить список этих виджетов, перебирать список, для каждого получать окно, поднимаясь по парентам и сравнивать с QApplication::activeWindow. Вопрос только один - приемлема ли скорость этого дела? Конечно есть вариант сделать свой мейнвиндоу, к-ый хранит указатель на этот виджет, но это как-то некузяво. Название: Re: Узнать имеет ли парент окно фокус Отправлено: ddrtn от Июня 14, 2011, 13:45 Лучше Qapplication::activeWindow()->findChild<A>(widget->objectName()); Для этого у дочерних виджетов необходимо указать уникальный objectName.
Название: Re: Узнать имеет ли парент окно фокус Отправлено: Авварон от Июня 14, 2011, 13:53 findChild не прокатит - искомые виджеты будут лежать в табвиджете:)
Еще извратный способ придумался, но кажись рабочий: при смене фокуса поднимаемся от фокус виджета пока не найдем нужный виджет. В случае смены фокуса на виджет, не лежащий на искомом, сверяем старый топЛевелВиндоу и новый, если совпадают, то все ок, менять ничего не надо, иначе мы открыли диалог или что-то в этом роде. Название: Re: Узнать имеет ли парент окно фокус Отправлено: ddrtn от Июня 14, 2011, 13:57 findChild ищет рекурсивно по всем чайдам чайлдов
Название: Re: Узнать имеет ли парент окно фокус Отправлено: Авварон от Июня 14, 2011, 14:05 Только им имя надо для каждой табы свое. А его наверху я знать не могу.
Название: Re: Узнать имеет ли парент окно фокус Отправлено: ddrtn от Июня 14, 2011, 14:10 Имя табы не надо. нужно имя объекта. а его можно генерить при создании объекта.
Название: Re: Узнать имеет ли парент окно фокус Отправлено: ddrtn от Июня 14, 2011, 14:14 хотя, конечно, лучше отслеживать изменение фокуса. вверх подниматься будет быстрее, чем вниз
Название: Re: Узнать имеет ли парент окно фокус Отправлено: Авварон от Июня 14, 2011, 14:27 А фак, тоже не прокатит, может быть так, что внутренние виджеты не имеют фокуса:( Черт
Название: Re: Узнать имеет ли парент окно фокус Отправлено: ddrtn от Июня 14, 2011, 14:29 опишите изначальную задачу? зачем это все? может чего придумаем
Название: Re: Узнать имеет ли парент окно фокус Отправлено: Авварон от Июня 14, 2011, 14:38 Я пишу сложную системку... Есть класс
Код: class PerspectiveWidget : public QWidget PerspectiveWidget умеет открывать "перспективу" - по айдишникам создавать классы Код: class IView : public QObject Код: class ActionManager : public QObject По-простому как-то так. Раньше был класс MainWindow, к-ый позволял получить текущие открытые вьюхи. Но тк его функциональность этим ограничиается, я пытаюсь его выкинуть (ненавижу интерфейсы из 1го метода) Название: Re: Узнать имеет ли парент окно фокус Отправлено: ddrtn от Июня 14, 2011, 14:41 Список открытых вьюх можно же хранить в статичесой переменной класса вьюхи. почему это не подходит.
Название: Re: Узнать имеет ли парент окно фокус Отправлено: Авварон от Июня 14, 2011, 14:43 Потому что я не знаю какая активна в данный момент.
Мне надо получить даже не активную вьюху, а активную перспективу знать (группу вьюх). PerspectiveWidget знает какие вьюхи в нем есть, поэтому достаточно получить активного его. Название: Re: Узнать имеет ли парент окно фокус Отправлено: ddrtn от Июня 14, 2011, 14:46 Кстати, я заморачивался с подобными действами. писал приложение, состоящие из одного лишь MainWindow.
Оно подгружало плагины, импортировала из них subwindow, меню и туллбар с уже готовыми акшинами. соответственно при активизации конкретного окна я добавлял в меню бар менюшку и туллбар на мэйн виндов Название: Re: Узнать имеет ли парент окно фокус Отправлено: Авварон от Июня 14, 2011, 14:49 Ага, именно для этого и надо) Проблема что я хочу разделить конкретную имплементацию окна (допустим с табами) от системы. Устроит вариант с абстракт мейн виндоу, но там реально ничего кроме метода молучения текущих вьюх да заполнения менюбара из экшнманагера ничего нет:(
Название: Re: Узнать имеет ли парент окно фокус Отправлено: ddrtn от Июня 14, 2011, 14:52 Для поиска активной перспективы можно у класса перспективы переопределить виджетный метод focusInEvent и в статической переменной хранить указатель на активную перспективу
Название: Re: Узнать имеет ли парент окно фокус Отправлено: Авварон от Июня 14, 2011, 14:53 проверил - не приходит Название: Re: Узнать имеет ли парент окно фокус Отправлено: ddrtn от Июня 14, 2011, 15:17 Можно где-то примерно так.
void PerspectiveWidget::changeEvent(QEvent *event) { if(event->type() == QEvent::ActivationChange) { if(isActive()) <Сохраняем указатель на текущую перспективу> } QDialog::changeEvent(event); } Название: Re: Узнать имеет ли парент окно фокус Отправлено: Авварон от Июня 14, 2011, 15:25 этот эвент приходит 1 раз, когда перспективу кладут на окно...
Название: Re: Узнать имеет ли парент окно фокус Отправлено: Авварон от Июня 14, 2011, 15:36 А вот QEvent::WindowActivate очень похоже на то, что надо:) Ща буду тестить
Вкупе с шоуэвентом Название: Re: Узнать имеет ли парент окно фокус Отправлено: ddrtn от Июня 14, 2011, 15:47 я запускал диалог. вызывалось это событие для уже неактивного окна. потом закрывал диалог - окно становилось активными и опять вызывалось это событие
|