Название: QFocusEvent определить предыдущий/последующий QWidget Отправлено: spectre71 от Июнь 18, 2009, 10:57 Можно ли на:
virtual void focusInEvent (QFocusEvent* event); virtual void focusOutEvent (QFocusEvent* event); Узнать - focusInEvent - Указатель на QWidget который имел фокус до - focusOutEvent - Указатель на QWidget который будет иметь фокус после Если можно, то как? Название: Re: QFocusEvent определить предыдущий/последующий QWidget Отправлено: ритт от Июнь 18, 2009, 11:18 полагаю, без велосипеда здесь не обойтись...
зато можно поставить задачу иначе, если объяснишь зачем это потребовалось :) Название: Re: QFocusEvent определить предыдущий/последующий QWidget Отправлено: spectre71 от Июнь 18, 2009, 11:49 1) Имею свой TPropertyEditor(см. на картинке) - наследован от QWidget на котором происходит отрисовка и подставляются TPEInplace(аналог QAbstractItemDelegate) для редактирования значений во второй колонке
2) TPEInplace наследован от QWidget, он имеет кучку наследников, которые в свою очередь тоже могут иметь их, например: TPEInplaceEdit - содержит QLineEdit TPEInplaceCombo - содержит QComboBox TPEInplaceCustomCommon - содержит QLineEdit и QToolButton ... ... 3) на переход фокуса от TPropertyEditor к TPEInplace отрисовка "Highlight" фокуса у TPropertyEditor не должна менятся 4) на потерю фокуса TPEInplace должна происходить установка значения(откат... зависит от ситуации), далее - если фокус перешел к TPropertyEditor перерисовку TPropertyEditor не делаем - если другому QWidget делаем перерисовку TPropertyEditor, поскольку должен перерисоваться "Highlight" фокуса 5) на потерю фокуса TPEInplace в определенных случаях у некоторых его наследников (например TPEInplaceFileIn : public TPEInplaceCustomCommon при вызове из него диалога) не должно устанавливаться значение в TPropertyEditor Отслеживание перехода фокуса от кого - кому было бы удобным. А так приходится изголяться. Название: Re: QFocusEvent определить предыдущий/последующий QWidget Отправлено: ритт от Июнь 18, 2009, 12:08 в прошлый раз ещё, когда видел эту картинку, хотел сказать, что симпатишно ))
по теме: эдитор ведь знает у кого из детей фокус - в focusEvent() просто запоминай этого ребёночка в переменную, предварительно сравнив значение с новым. пп. 1-5 легко решаются таким способом. вот если бы задача была в масштабе аппликейшена, пришлось бы строить велосипедище... ) Название: Re: QFocusEvent определить предыдущий/последующий QWidget Отправлено: spectre71 от Июнь 18, 2009, 13:21 в прошлый раз ещё, когда видел эту картинку, хотел сказать, что симпатишно )) (1) и (2) как-бы ни причем, это только описаниепо теме: эдитор ведь знает у кого из детей фокус - в focusEvent() просто запоминай этого ребёночка в переменную, предварительно сравнив значение с новым. пп. 1-5 легко решаются таким способом. вот если бы задача была в масштабе аппликейшена, пришлось бы строить велосипедище... ) (3) Я делаю так "Highlight" проверяется через: bool TPropertyEditor::focused (void) { return hasFocus() || (CurInplace && CurInplace->focused()); } а TPEInplace::focused() - якобы сам знает что возвращать (4) и (5) - на самом деле идут как один пункт Проблема в том что focusOutEvent у теряющего срабатывает раньше чем focusInEvent у получающего. И беда происходит если не должно устанавливаться(измениться) значение в TPropertyEditor, например: class TPEInplaceFileIn : public TPEInplaceCustomCommon TPEInplaceCustomCommon - содержит QLineEdit и QToolButton на потерю фокуса QLineEdit должно устанавливаться новое значение, но кроме случая нажатия QToolButton. Поскольку focusOutEvent у QLineEdit происходит раньше получение фокуса кем-либо например QToolButton, то я не могу определить что мне делать устанавливать или не устанавливать новое значение. Вызов диалога по нажатию QToolButton не представляет проблемы здесь просто на нажатие кнопки делаю что-то типа: lockDataChange(); Dialog->exec(); unlockDataChange(); И на потерю фокуса QLineEdit проверка if(lockedDataChange()) - не устанавливаем новое значение Название: Re: QFocusEvent определить предыдущий/последующий QWidget Отправлено: pastor от Июнь 18, 2009, 14:57 Если задан focus order, то метод ниже должен помочь:
Цитировать QWidget * QWidget::nextInFocusChain () const Returns the next widget in this widget's focus chain. К сожалению метода previoustInFocusChain нет. По этому поводу закинул сагесты тролям. 201649 - Provide a previousInFocusChain for consistancy (http://www.qtsoftware.com/developer/task-tracker/index_html?id=201649&method=entry) 242289 - QWidget: add a first/lastInFocusChain() so its easy to get to the beginning and end of the focus chain for a widget (http://www.qtsoftware.com/developer/task-tracker/index_html?id=242289&method=entry) Название: Re: QFocusEvent определить предыдущий/последующий QWidget Отправлено: spectre71 от Июнь 18, 2009, 15:42 Если задан focus order, то метод ниже должен помочь: Что такое focus order, как он может быть задан. tab order - понятно, но он мне ничем не поможет. Цитировать QWidget * QWidget::nextInFocusChain () const Returns the next widget in this widget's focus chain. Вообще не понятно о чем речь и для чего нужно. Название: Re: QFocusEvent определить предыдущий/последующий QWidget Отправлено: MoPDoBoPoT от Июнь 18, 2009, 16:14 Узнать - focusOutEvent - Указатель на QWidget который будет иметь фокус после QApplication::focusWidget(); ------------------------- Вот это по-моему поможет: void QApplication::focusChanged ( QWidget * old, QWidget * now ) [signal] Название: Re: QFocusEvent определить предыдущий/последующий QWidget Отправлено: spectre71 от Июнь 18, 2009, 17:06 Спасибо.
QApplication::focusWidget() работает в focusOutEvent, показывает на того кто получит фокус, по крайней мере под XP. Главное чтоб это было переносимо. Сигнал проверю позже. Название: Re: QFocusEvent определить предыдущий/последующий QWidget Отправлено: pastor от Июнь 18, 2009, 17:11 Что такое focus order, как он может быть задан. tab order - понятно, но он мне ничем не поможет. tab order я имел ввиду. Тогда непонятно, по какому принципу у тебя передается фокус от виджета к виджету. Поэтому вопрос, кака происходит передача фокуса? Название: Re: QFocusEvent определить предыдущий/последующий QWidget Отправлено: pastor от Июнь 18, 2009, 17:18 Вообще не понятно о чем речь и для чего нужно. Тут все просто, у тебя есть виджет, на нем располагаюся другие виджеты, например A, B, C и D. И задан определенный порядок передачи фокуса, например A->B->D->C->A. Допустим B имеет фокус. Вызов метода nextInFocusChain для родительского виджета вернет указатель на D. ЗЫ: Видимо это не применимо к твоей задаче Название: Re: QFocusEvent определить предыдущий/последующий QWidget Отправлено: mks56 от Июнь 19, 2009, 13:09 Все делается просто:
1. берется родитель 2. берем его список детей 3. применяем последовательно ко все детям QWidget * QWidget::nextInFocusChain () const, пока не получим this Все Название: Re: QFocusEvent определить предыдущий/последующий QWidget Отправлено: spectre71 от Июнь 19, 2009, 16:59 Все делается просто: Это к чему! Не по теме. Надо внимательно читать, и с начала. 1. берется родитель 2. берем его список детей 3. применяем последовательно ко все детям QWidget * QWidget::nextInFocusChain () const, пока не получим this Все Задача уже решена. |