Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: spectre71 от Июнь 18, 2009, 10:57



Название: 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
в прошлый раз ещё, когда видел эту картинку, хотел сказать, что симпатишно ))

по теме: эдитор ведь знает у кого из детей фокус - в focusEvent() просто запоминай этого ребёночка в переменную, предварительно сравнив значение с новым.
пп. 1-5 легко решаются таким способом. вот если бы задача была в масштабе аппликейшена, пришлось бы строить велосипедище... )
(1) и (2) как-бы ни причем, это только описание
(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

Все
Это к чему! Не по теме. Надо внимательно читать, и с начала.
Задача уже решена.