Russian Qt Forum
Ноябрь 25, 2024, 05:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFocusEvent определить предыдущий/последующий QWidget  (Прочитано 9088 раз)
spectre71
Гость
« : Июнь 18, 2009, 10:57 »

Можно ли на:
    virtual void focusInEvent  (QFocusEvent* event);
    virtual void focusOutEvent (QFocusEvent* event);
Узнать
- focusInEvent  - Указатель на QWidget который имел фокус до
- focusOutEvent - Указатель на QWidget который будет иметь фокус после

Если можно, то как?
Записан
ритт
Гость
« Ответ #1 : Июнь 18, 2009, 11:18 »

полагаю, без велосипеда здесь не обойтись...
зато можно поставить задачу иначе, если объяснишь зачем это потребовалось Улыбающийся
Записан
spectre71
Гость
« Ответ #2 : Июнь 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

Отслеживание перехода фокуса от кого - кому было бы удобным. А так приходится изголяться.

   
« Последнее редактирование: Июнь 18, 2009, 11:51 от spectre71 » Записан
ритт
Гость
« Ответ #3 : Июнь 18, 2009, 12:08 »

в прошлый раз ещё, когда видел эту картинку, хотел сказать, что симпатишно ))

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









Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Июнь 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
242289 - QWidget: add a first/lastInFocusChain() so its easy to get to the beginning and end of the focus chain for a widget
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
spectre71
Гость
« Ответ #6 : Июнь 18, 2009, 15:42 »

Если задан focus order, то метод ниже должен помочь:

Что такое focus order, как он может быть задан.
tab order - понятно, но он мне ничем не поможет.

Цитировать
QWidget * QWidget::nextInFocusChain () const
Returns the next widget in this widget's focus chain.

Вообще не понятно о чем речь и для чего нужно.
Записан
MoPDoBoPoT
Гость
« Ответ #7 : Июнь 18, 2009, 16:14 »

Узнать
- focusOutEvent - Указатель на QWidget который будет иметь фокус после

QApplication::focusWidget();


-------------------------
Вот это по-моему поможет:
void QApplication::focusChanged ( QWidget * old, QWidget * now )   [signal]
« Последнее редактирование: Июнь 18, 2009, 16:42 от MoPDoBoPoT » Записан
spectre71
Гость
« Ответ #8 : Июнь 18, 2009, 17:06 »

Спасибо.
QApplication::focusWidget()  работает в focusOutEvent, показывает на того кто получит фокус, по крайней мере под XP. Главное чтоб это было переносимо.
Сигнал проверю позже.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #9 : Июнь 18, 2009, 17:11 »

Что такое focus order, как он может быть задан.
tab order - понятно, но он мне ничем не поможет.

tab order я имел ввиду. Тогда непонятно, по какому принципу у тебя передается фокус от виджета к виджету. Поэтому вопрос, кака происходит передача фокуса?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Июнь 18, 2009, 17:18 »

Вообще не понятно о чем речь и для чего нужно.

Тут все просто, у тебя есть виджет, на нем располагаюся другие виджеты, например A, B, C и D. И задан определенный порядок передачи фокуса, например  A->B->D->C->A. Допустим B имеет фокус. Вызов метода nextInFocusChain для родительского виджета вернет указатель на D.

ЗЫ: Видимо это не применимо к твоей задаче
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
mks56
Гость
« Ответ #11 : Июнь 19, 2009, 13:09 »

Все делается просто:
1. берется родитель
2. берем его список детей
3. применяем последовательно ко все детям QWidget * QWidget::nextInFocusChain () const, пока не получим this

Все
Записан
spectre71
Гость
« Ответ #12 : Июнь 19, 2009, 16:59 »

Все делается просто:
1. берется родитель
2. берем его список детей
3. применяем последовательно ко все детям QWidget * QWidget::nextInFocusChain () const, пока не получим this

Все
Это к чему! Не по теме. Надо внимательно читать, и с начала.
Задача уже решена.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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