Russian Qt Forum

Qt => Qt Quick => Тема начата: ksk- от Апрель 07, 2013, 21:54



Название: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: ksk- от Апрель 07, 2013, 21:54
Всем привет. Имеется некий ListView, содержащий некоторое кол-во элементов. Каждый из этих элементов должен отправлять сигнал, одним из параметров которого является ссылка на этот самый элемент. Как это сделать?


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: _OLEGator_ от Апрель 07, 2013, 22:21
В чем собственно проблема то? Сигнал же сам определяешь и его параметры, что мешает вставить в параметры сигнала класс этого элемента?
И я бы сделал сигнал от ListView, если не требуется такой необходимости, чтобы каждый элемент испускал сигнал сам.


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: RedDog от Апрель 07, 2013, 22:50
sender() не?


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: Bepec от Апрель 08, 2013, 00:06
Sender sender ) Просто незнание заставляет выдумывать страшные вещи :)


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: Day от Апрель 08, 2013, 08:04
Будучи даже не Чайником, а Новичком, сочувствую. Я тоже долго с этим мучился, пока товарищи не подсказали.
Цитировать
Внутри слота вызовом метода sender() можно узнать от какого объекта был выслан сигнал.
М.Шлее гл.2 Слоты
Код:
QObject *obj = QObject::sender();
Далее приводите этот obj к чему надо...


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: Igors от Апрель 08, 2013, 12:10
Использование sender может и не быть лучшим (напр в случае QueuedConnection).


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: GreatSnake от Апрель 08, 2013, 12:29
Использование sender может и не быть лучшим (напр в случае QueuedConnection).
В случае QueuedConnection использование чего угодно с сcылкой на объект может быть не лучшим :)


Название: Re: Как заставить элемент отправлять сигнал &
Отправлено: mutineer от Апрель 08, 2013, 12:30
Сделай параметр типа variant и передавай в него id самого себя. Только учти, что делегат может быть уничтожен, когда в процессе скроллинга выйдет за границы окна


Название: Re: Как заставить элемент отправлять сигнал &
Отправлено: GreatSnake от Апрель 08, 2013, 12:33
Только учти, что делегат может быть уничтожен, когда в процессе скроллинга выйдет за границы окна
Интересное утверждение. Раскройте мысль, пожалуйста.


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: Bepec от Апрель 08, 2013, 12:37
Не может такого быть :)
Делегат существует вне зависимости от наличия ячеек на экране, если уж вы его установили :)


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: mutineer от Апрель 08, 2013, 12:38
У ListView есть буфер в пикселях (определяется параметром cacheBuffer http://doc.qt.digia.com/4.7/qml-listview.html#cacheBuffer-prop). Если в процессе скроллинга делегат скрылся с экрана и ушел за пределы буфера, то делегат уничтожается и пересоздастся тогда, когда снова попадет в область буфера. Проверяется вставкой console.log в Component.onCompleted и Component.onDestruction делегата


Название: Re: Как заставить элемент отправлять сигнал &
Отправлено: mutineer от Апрель 08, 2013, 12:39
Не может такого быть :)
Делегат существует вне зависимости от наличия ячеек на экране, если уж вы его установили :)

Я говорю о конкретном инстансе делегата, предназанченном для отображения конкретного элемента


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: Igors от Апрель 08, 2013, 12:39
В случае QueuedConnection использование чего угодно с сcылкой на объект может быть не лучшим :)
В случае явной передачи параметра это не проблема - напр можно задействовать quard


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: ksk- от Апрель 08, 2013, 14:04
В функции-слоте делаю следующее:
Код:
QQuickItem *item = qobject_cast<QQuickItem*>(sender())
connect(this, SIGNAL(progressChanged(int)), item, SLOT(setProgress(int)));

При вызове слота получаю:
Код:
QObject::connect: Cannot connect Downloader::progressChanged(int) to (null)::setProgress(int)


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: mutineer от Апрель 08, 2013, 14:44
Значит sender() не является объектом класса QQuickItem или его потомком


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: ksk- от Апрель 08, 2013, 15:21
Значит sender() не является объектом класса QQuickItem или его потомком

Сделал вот так:
Код
C++ (Qt)
QObject *item = qvariant_cast<QObject*>(variant);
Заработало. Всё-таки "sender()" не помог.

Это тоже работает.
Код
C++ (Qt)
QQuickItem *item = qvariant_cast<QQuickItem*>(variant);

Не знаю, как будет правильней.


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: mutineer от Апрель 08, 2013, 15:40
Если бы еще знать что такое variant...


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: ksk- от Апрель 08, 2013, 16:22
Если бы еще знать что такое variant...
variant - это параметр типа QVariant, через который передаю id QML элемента, как было предложено Вами выше.


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: ksk- от Апрель 08, 2013, 16:26
Однако функцию "setProgress(int)" в QML файле я всё же не могу соединить с сигналом.
Код:
QObject::connect: No such slot QQuickColumn_QML_8::setProgress(int)


Название: Re: Как заставить элемент отправлять сигнал &
Отправлено: mutineer от Апрель 08, 2013, 16:33
Если бы еще знать что такое variant...
variant - это параметр типа QVariant, через который передаю id QML элемента, как было предложено Вами выше.

Мною было предложено использовать тип variant в QML ибо в теме ни слова не было о том, что сигнал надо ловить в плюсовом коде


Название: Re: Как заставить элемент отправлять сигнал &
Отправлено: ksk- от Апрель 08, 2013, 16:50
Если бы еще знать что такое variant...
variant - это параметр типа QVariant, через который передаю id QML элемента, как было предложено Вами выше.

Мною было предложено использовать тип variant в QML ибо в теме ни слова не было о том, что сигнал надо ловить в плюсовом коде

Но всё равно спасибо, это работает. )))


Название: Re: Как заставить элемент отправлять сигнал со ссылкой на себя?
Отправлено: ksk- от Апрель 08, 2013, 16:52
Однако функцию "setProgress(int)" в QML файле я всё же не могу соединить с сигналом.
Код:
QObject::connect: No such slot QQuickColumn_QML_8::setProgress(int)

Замена типа параметра с int на QVariant у сигнала и слота, помогла.