Russian Qt Forum
Июля 04, 2025, 20:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Узнать имеет ли парент окно фокус  (Прочитано 6881 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« : Июня 14, 2011, 13:33 »

Дано - есть куча виджетов класса А. Надо - узнать какой из них лежит на активном окне.
Думается что надо как-то так - хранить список этих виджетов, перебирать список, для каждого получать окно, поднимаясь по парентам и сравнивать с QApplication::activeWindow.
Вопрос только один - приемлема ли скорость этого дела?
Конечно есть вариант сделать свой мейнвиндоу, к-ый хранит указатель на этот виджет, но это как-то некузяво.
Записан
ddrtn
Гость
« Ответ #1 : Июня 14, 2011, 13:45 »

Лучше Qapplication::activeWindow()->findChild<A>(widget->objectName()); Для этого у дочерних виджетов необходимо указать уникальный objectName.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Июня 14, 2011, 13:53 »

findChild не прокатит - искомые виджеты будут лежать в табвиджете:)
Еще извратный способ придумался, но кажись рабочий:
при смене фокуса поднимаемся от фокус виджета пока не найдем нужный виджет. В случае смены фокуса на виджет, не лежащий на искомом, сверяем старый топЛевелВиндоу и новый, если совпадают, то все ок, менять ничего не надо, иначе мы открыли диалог или что-то в этом роде.
Записан
ddrtn
Гость
« Ответ #3 : Июня 14, 2011, 13:57 »

findChild ищет рекурсивно по всем чайдам чайлдов
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Июня 14, 2011, 14:05 »

Только им имя надо для каждой табы свое. А его наверху я знать не могу.
Записан
ddrtn
Гость
« Ответ #5 : Июня 14, 2011, 14:10 »

Имя табы не надо. нужно имя объекта. а его можно генерить при создании объекта.
Записан
ddrtn
Гость
« Ответ #6 : Июня 14, 2011, 14:14 »

хотя, конечно, лучше отслеживать изменение фокуса. вверх подниматься будет быстрее, чем вниз
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #7 : Июня 14, 2011, 14:27 »

А фак, тоже не прокатит, может быть так, что внутренние виджеты не имеют фокуса:( Черт
Записан
ddrtn
Гость
« Ответ #8 : Июня 14, 2011, 14:29 »

опишите изначальную задачу? зачем это все? может чего придумаем
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Июня 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го метода)
Записан
ddrtn
Гость
« Ответ #10 : Июня 14, 2011, 14:41 »

Список открытых вьюх можно же хранить в статичесой переменной класса вьюхи. почему это не подходит.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Июня 14, 2011, 14:43 »

Потому что я не знаю какая активна в данный момент.
Мне надо получить даже не активную вьюху, а активную перспективу знать (группу вьюх). PerspectiveWidget знает какие вьюхи в нем есть, поэтому достаточно получить активного его.
Записан
ddrtn
Гость
« Ответ #12 : Июня 14, 2011, 14:46 »

Кстати, я заморачивался с подобными действами. писал приложение, состоящие из одного лишь MainWindow.
Оно подгружало плагины, импортировала из них subwindow, меню и туллбар с уже готовыми акшинами. соответственно при активизации конкретного окна я добавлял в меню бар менюшку и туллбар на мэйн виндов
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #13 : Июня 14, 2011, 14:49 »

Ага, именно для этого и надо) Проблема что я хочу разделить конкретную имплементацию окна (допустим с табами) от системы. Устроит вариант с абстракт мейн виндоу, но там реально ничего кроме метода молучения текущих вьюх да заполнения менюбара из экшнманагера ничего нет:(
Записан
ddrtn
Гость
« Ответ #14 : Июня 14, 2011, 14:52 »

Для поиска активной перспективы можно у класса перспективы переопределить виджетный метод focusInEvent и в статической переменной хранить указатель на активную перспективу
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.024 секунд. Запросов: 20.