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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как заставить элемент отправлять сигнал со ссылкой на себя?  (Прочитано 10053 раз)
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« : Апрель 07, 2013, 21:54 »

Всем привет. Имеется некий ListView, содержащий некоторое кол-во элементов. Каждый из этих элементов должен отправлять сигнал, одним из параметров которого является ссылка на этот самый элемент. Как это сделать?
Записан
_OLEGator_
Гость
« Ответ #1 : Апрель 07, 2013, 22:21 »

В чем собственно проблема то? Сигнал же сам определяешь и его параметры, что мешает вставить в параметры сигнала класс этого элемента?
И я бы сделал сигнал от ListView, если не требуется такой необходимости, чтобы каждый элемент испускал сигнал сам.
Записан
RedDog
Гость
« Ответ #2 : Апрель 07, 2013, 22:50 »

sender() не?
Записан
Bepec
Гость
« Ответ #3 : Апрель 08, 2013, 00:06 »

Sender sender ) Просто незнание заставляет выдумывать страшные вещи Улыбающийся
Записан
Day
Частый гость
***
Offline Offline

Сообщений: 290


Просмотр профиля
« Ответ #4 : Апрель 08, 2013, 08:04 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апрель 08, 2013, 12:10 »

Использование sender может и не быть лучшим (напр в случае QueuedConnection).
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Апрель 08, 2013, 12:29 »

Использование sender может и не быть лучшим (напр в случае QueuedConnection).
В случае QueuedConnection использование чего угодно с сcылкой на объект может быть не лучшим Улыбающийся
Записан

Qt 5.11/4.8.7 (X11/Win)
mutineer
Гость
« Ответ #7 : Апрель 08, 2013, 12:30 »

Сделай параметр типа variant и передавай в него id самого себя. Только учти, что делегат может быть уничтожен, когда в процессе скроллинга выйдет за границы окна
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Апрель 08, 2013, 12:33 »

Только учти, что делегат может быть уничтожен, когда в процессе скроллинга выйдет за границы окна
Интересное утверждение. Раскройте мысль, пожалуйста.
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #9 : Апрель 08, 2013, 12:37 »

Не может такого быть Улыбающийся
Делегат существует вне зависимости от наличия ячеек на экране, если уж вы его установили Улыбающийся
Записан
mutineer
Гость
« Ответ #10 : Апрель 08, 2013, 12:38 »

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

Не может такого быть Улыбающийся
Делегат существует вне зависимости от наличия ячеек на экране, если уж вы его установили Улыбающийся

Я говорю о конкретном инстансе делегата, предназанченном для отображения конкретного элемента
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Апрель 08, 2013, 12:39 »

В случае QueuedConnection использование чего угодно с сcылкой на объект может быть не лучшим Улыбающийся
В случае явной передачи параметра это не проблема - напр можно задействовать quard
Записан
ksk-
Самовар
**
Offline Offline

Сообщений: 178



Просмотр профиля
« Ответ #13 : Апрель 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)
Записан
mutineer
Гость
« Ответ #14 : Апрель 08, 2013, 14:44 »

Значит sender() не является объектом класса QQuickItem или его потомком
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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