Название: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: Rosster от Декабрь 21, 2012, 15:54 Есть QTreeWidget. Мне нужно чтобы пользователь работал и мышкой и клавиатурой. Т.е. при изменении item'а вызывалась функция.
Делаю так: connect(ui->tree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(slClickTree())); connect(ui->tree, SIGNAL(itemClicked(QTreeWidgetItem *, int )), this, SLOT(slClickTree())); Все ок, но когда я кликаю на другой item срабатывает currentItemChanged автоматом. В итоге функция вызывается 2 раза. Как этого избежать? Я не использую только currentItemChanged, потому что при клике, даже если item тот же, мне нужно обновить данные в другом месте. Спасибо. Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: Bepec от Декабрь 21, 2012, 16:25 Не понял. У вас в чем проблема? Всё работает согласно вашему коду. Сначала итем выделяется (currentChanged), потом получает клик(clicked). Всё ок.
И ваше "объяснение" про использование 2-х сигналов мне непонятно. Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: GreatSnake от Декабрь 21, 2012, 16:53 В итоге функция вызывается 2 раза. Как этого избежать? Ставь "гарды" в slClickTree() либо задействуй второй слот.Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: andrew.k от Декабрь 23, 2012, 18:32 Код
Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: Rosster от Декабрь 24, 2012, 10:24 Попробую еще раз объяснить:
Когда я кликаю на итем (кроме текущего) у меня вызывается 2 раза slClickTree(), потому что изменился тек. итем и плюс я кликнул. А мне нужно один раз. Можно было просто оставить один сигнал currentItemChanged и он бы успешно работал. Но мне при клике на текущем итем нужно вызывать slClickTree() по-любому (требуется для обновления данных). Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: GreatSnake от Декабрь 24, 2012, 10:28 Не надо объяснять несколько раз очевидные вещи.
Чем не устраивают предложенные варианты решения? Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: Rosster от Декабрь 24, 2012, 11:30 Ставь "гарды" в slClickTree() либо задействуй второй слот. Что такое "гарды"?Код
Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: carrygun от Декабрь 24, 2012, 12:33 Зачем вешать на clicked(), если currentItemChanged() обрабатывает события как нужно, не зависимо от того меняется итем мышью или клавиатурой. На clicked() нужно повесить именно твое обновление.
Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: Rosster от Декабрь 24, 2012, 13:33 Зачем вешать на clicked(), если currentItemChanged() обрабатывает события как нужно, не зависимо от того меняется итем мышью или клавиатурой. На clicked() нужно повесить именно твое обновление. Может мы не понимаем друг друга?Потому что есть только один слот slClickTree(). Нужно его обрабатывать двумя этими сигналами. Пользователь ходит по дереву с помощью клавиатуры, а в другом виджете меняет инфу. Если он что-то не так сделал - обновляет данные путем клика на этот же итем (привязать кнопку к обновлению не входит в задачу). И все отлично. Но вот пользователь кликнул мышью на другой итем, по сути мне нужно выполнить один раз slClickTree(). Но вызывается два раза, что очевидно Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: carrygun от Декабрь 24, 2012, 13:39 Ну могу только посоветовать завести переменную допустим
Код: QTreeWidgetItem *m_lastItem; Жалко что в clicked() нельзя сравнить прилетающий в параметре элемент с тем что в currentItem(), он, к сожалению, устанавливается раньше. Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: Rosster от Декабрь 24, 2012, 13:50 Ну могу только посоветовать завести переменную допустим Я этот вариант тоже рассматривал, правда он не очень красивый. Но одно но: а вы уверены, что currentItemChanged() выполняется раньше clicked()?Код: QTreeWidgetItem *m_lastItem; Жалко что в clicked() нельзя сравнить прилетающий в параметре элемент с тем что в currentItem(), он, к сожалению, устанавливается раньше. Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: carrygun от Декабрь 24, 2012, 13:57 Сейчас попробовал:
Код: changed Должно сработать по идее. PS то есть не сработает( Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: Rosster от Декабрь 24, 2012, 14:03 Сейчас попробовал: У меня тоже, но где-то прочитал, что в это верить нельзя. Типа на разных платформах или от чего-то еще порядок может быть другой. Ну лан, раз в принципе больше идей никаких, придется этот использовать. Спасибо за ответы;)Код: changed Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: carrygun от Декабрь 24, 2012, 14:50 Мой хитрый план не сработает, ведь в changed m_lastItem будет будет указывать туда же куда и параметр в прилетающем clicked. Остается надеяться на папок, что скажут они, я чтото прямо сам себя в тупик загнал.
Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: kambala от Декабрь 24, 2012, 17:49 такие хитрые манипуляции лучше через фильтр событий проворачивать т.к. всё будет в одном методе, а айтем вычислять через координаты
Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget Отправлено: Rosster от Декабрь 25, 2012, 11:12 такие хитрые манипуляции лучше через фильтр событий проворачивать т.к. всё будет в одном методе, а айтем вычислять через координаты Спасибо, попробую что-то сделать в этом плане) |