Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Rosster от Декабрь 21, 2012, 15:54



Название: сигналы на 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
Код
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();
}
 
 


Название: 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() либо задействуй второй слот.
Что такое "гарды"?

Код
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(). не понял разницы.


Название: 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;
и в слоте currentItemChanged() запоминать на какой элемент изменился текущий. А уже в clicked() сравнивать кликнутый на этот самый m_lastItem.

Жалко что в clicked() нельзя сравнить прилетающий в параметре элемент с тем что в currentItem(), он, к сожалению, устанавливается раньше.


Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget
Отправлено: Rosster от Декабрь 24, 2012, 13:50
Ну могу только посоветовать завести переменную допустим
Код:
QTreeWidgetItem *m_lastItem;
и в слоте currentItemChanged() запоминать на какой элемент изменился текущий. А уже в clicked() сравнивать кликнутый на этот самый m_lastItem.

Жалко что в clicked() нельзя сравнить прилетающий в параметре элемент с тем что в currentItem(), он, к сожалению, устанавливается раньше.
Я этот вариант тоже рассматривал, правда он не очень красивый. Но одно но: а вы уверены, что currentItemChanged() выполняется раньше clicked()?


Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget
Отправлено: carrygun от Декабрь 24, 2012, 13:57
Сейчас попробовал:
Код:
changed 
clicked
changed
clicked

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

PS то есть не сработает(


Название: Re: сигналы на click() и currentItemChanged() в QTreeWidget
Отправлено: Rosster от Декабрь 24, 2012, 14:03
Сейчас попробовал:
Код:
changed 
clicked
changed
clicked
Должно сработать по идее.
У меня тоже, но где-то прочитал, что в это верить нельзя. Типа на разных платформах или от чего-то еще порядок может быть другой. Ну лан, раз в принципе больше идей никаких, придется этот использовать. Спасибо за ответы;)


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