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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: сигналы на click() и currentItemChanged() в QTreeWidget  (Прочитано 12152 раз)
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 тот же, мне нужно обновить данные в другом месте.
Спасибо.
Записан
Bepec
Гость
« Ответ #1 : Декабрь 21, 2012, 16:25 »

Не понял. У вас в чем проблема? Всё работает согласно вашему коду. Сначала итем выделяется (currentChanged), потом получает клик(clicked). Всё ок.

И ваше "объяснение" про использование 2-х сигналов мне непонятно.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Декабрь 21, 2012, 16:53 »

В итоге функция вызывается 2 раза. Как этого избежать?
Ставь "гарды" в slClickTree() либо задействуй второй слот.
Записан

Qt 5.11/4.8.7 (X11/Win)
andrew.k
Гость
« Ответ #3 : Декабрь 23, 2012, 18:32 »

Код
C++ (Qt)
connect(ui->tree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(onCurrentChanged()));
connect(ui->tree, SIGNAL(itemClicked(QTreeWidgetItem *, int )), this, SLOT(updateIt()));
 
void onCurrentChanged()
{
 ... что-то делаем
 
 updateIt();
}
 
 
Записан
Rosster
Гость
« Ответ #4 : Декабрь 24, 2012, 10:24 »

Попробую еще раз объяснить:
Когда я кликаю на итем (кроме текущего) у меня вызывается 2 раза slClickTree(), потому что изменился тек. итем и плюс я кликнул. А мне нужно один раз. Можно было просто оставить один сигнал currentItemChanged и он бы успешно работал. Но мне при клике на текущем итем нужно вызывать slClickTree() по-любому (требуется для обновления данных).
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Декабрь 24, 2012, 10:28 »

Не надо объяснять несколько раз очевидные вещи.
Чем не устраивают предложенные варианты решения?
Записан

Qt 5.11/4.8.7 (X11/Win)
Rosster
Гость
« Ответ #6 : Декабрь 24, 2012, 11:30 »

Ставь "гарды" в slClickTree() либо задействуй второй слот.
Что такое "гарды"?

Код
C++ (Qt)
connect(ui->tree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(onCurrentChanged()));
connect(ui->tree, SIGNAL(itemClicked(QTreeWidgetItem *, int )), this, SLOT(updateIt()));
 
void onCurrentChanged()
{
 ... что-то делаем
 
 updateIt();
}
 
 
Если так писать, то при клике вызовится updateIt(), а также onCurrentChanged(), который в свою очередь также вызовет updateIt(). не понял разницы.
Записан
carrygun
Гость
« Ответ #7 : Декабрь 24, 2012, 12:33 »

Зачем вешать на clicked(), если currentItemChanged() обрабатывает события как нужно, не зависимо от того меняется итем мышью или клавиатурой. На clicked() нужно повесить именно твое обновление.
Записан
Rosster
Гость
« Ответ #8 : Декабрь 24, 2012, 13:33 »

Зачем вешать на clicked(), если currentItemChanged() обрабатывает события как нужно, не зависимо от того меняется итем мышью или клавиатурой. На clicked() нужно повесить именно твое обновление.
Может мы не понимаем друг друга?
Потому что есть только один слот slClickTree(). Нужно его обрабатывать двумя этими сигналами. Пользователь ходит по дереву с помощью клавиатуры, а в другом виджете меняет инфу. Если он что-то не так сделал - обновляет данные путем клика на этот же итем (привязать кнопку к обновлению не входит в задачу). И все отлично. Но вот пользователь кликнул мышью на другой итем, по сути мне нужно выполнить один раз slClickTree(). Но вызывается два раза, что очевидно
Записан
carrygun
Гость
« Ответ #9 : Декабрь 24, 2012, 13:39 »

Ну могу только посоветовать завести переменную допустим
Код:
QTreeWidgetItem *m_lastItem;
и в слоте currentItemChanged() запоминать на какой элемент изменился текущий. А уже в clicked() сравнивать кликнутый на этот самый m_lastItem.

Жалко что в clicked() нельзя сравнить прилетающий в параметре элемент с тем что в currentItem(), он, к сожалению, устанавливается раньше.
Записан
Rosster
Гость
« Ответ #10 : Декабрь 24, 2012, 13:50 »

Ну могу только посоветовать завести переменную допустим
Код:
QTreeWidgetItem *m_lastItem;
и в слоте currentItemChanged() запоминать на какой элемент изменился текущий. А уже в clicked() сравнивать кликнутый на этот самый m_lastItem.

Жалко что в clicked() нельзя сравнить прилетающий в параметре элемент с тем что в currentItem(), он, к сожалению, устанавливается раньше.
Я этот вариант тоже рассматривал, правда он не очень красивый. Но одно но: а вы уверены, что currentItemChanged() выполняется раньше clicked()?
Записан
carrygun
Гость
« Ответ #11 : Декабрь 24, 2012, 13:57 »

Сейчас попробовал:
Код:
changed 
clicked
changed
clicked

Должно сработать по идее.

PS то есть не сработает(
« Последнее редактирование: Декабрь 24, 2012, 14:01 от carrygun » Записан
Rosster
Гость
« Ответ #12 : Декабрь 24, 2012, 14:03 »

Сейчас попробовал:
Код:
changed 
clicked
changed
clicked
Должно сработать по идее.
У меня тоже, но где-то прочитал, что в это верить нельзя. Типа на разных платформах или от чего-то еще порядок может быть другой. Ну лан, раз в принципе больше идей никаких, придется этот использовать. Спасибо за ответы;)
Записан
carrygun
Гость
« Ответ #13 : Декабрь 24, 2012, 14:50 »

Мой хитрый план не сработает, ведь в changed m_lastItem будет будет указывать туда же куда и параметр в прилетающем clicked. Остается надеяться на папок, что скажут они, я чтото прямо сам себя в тупик загнал.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #14 : Декабрь 24, 2012, 17:49 »

такие хитрые манипуляции лучше через фильтр событий проворачивать т.к. всё будет в одном методе, а айтем вычислять через координаты
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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