Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Авварон от Июня 14, 2011, 13:33



Название: Узнать имеет ли парент окно фокус
Отправлено: Авварон от Июня 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
{...
    void openPerspective(const QString &perspective);
...}

"Перспектива" содержит набор айдишников вьюх.
PerspectiveWidget умеет открывать "перспективу" - по айдишникам создавать классы
Код:
class IView : public QObject 
{...
    virtual QWidget *widget() const = 0;
    virtual QToolBar *toolBar() const { return 0; }
...}
И есть класс
Код:
class ActionManager : public QObject
{...
    void registerAction(QAction *action, const QString &id);
    bool connect(const QString &actionId, const QString &viewId, const char *slot);
...}
Умеет регать экшны и коннектить экшн к вьюхе (слот вызывается только если вьюха активна - в текущем окне открыта перспектива, содержащая эту вью)
По-простому как-то так.
Раньше был класс 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
я запускал диалог. вызывалось это событие для уже неактивного окна. потом закрывал диалог - окно становилось активными и опять вызывалось это событие