Название: Как заставить элемент отправлять сигнал со ссылкой на себя? Отправлено: 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(); Название: 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()) При вызове слота получаю: Код: 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 или его потомком Сделал вот так: Код Заработало. Всё-таки "sender()" не помог. Это тоже работает. Код
Не знаю, как будет правильней. Название: 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 у сигнала и слота, помогла. |