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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как правильно передавать объекты в слот?  (Прочитано 3956 раз)
billygates
Гость
« : Январь 15, 2010, 16:23 »

В коде класса, которые может инициировать сигналы:
Код:
 MyObject* obj = ObjectMaker(arg1, arg2); // фабрика
 ...
  emit classSignal(&obj);
соответственно переданный obj удаляется в слоте (delete *obj). Как правильно передавать в слоты динамические объекты?
По указателю как здесь? Используя что-то вроде QSharedPointer? Или как-то иначе?

P.S. MyObject не является потомком QObject.

Спасибо.
Записан
BRE
Гость
« Ответ #1 : Январь 15, 2010, 16:32 »

Цитировать
The optional type parameter describes the type of connection to establish. In particular, it determines whether a particular signal is delivered to a slot immediately or queued for delivery at a later time. If the signal is queued, the parameters must be of types that are known to Qt's meta-object system, because Qt needs to copy the arguments to store them in an event behind the scenes. If you try to use a queued connection and get the error message

 QObject::connect: Cannot queue arguments of type 'MyType'
 (Make sure 'MyType' is registered using qRegisterMetaType().)
call qRegisterMetaType() to register the data type before you establish the connection.
Записан
Dendy
Гость
« Ответ #2 : Январь 15, 2010, 17:49 »

Что хранится в MyObject и какая задача возлагается на сигнал?
Записан
billygates
Гость
« Ответ #3 : Январь 16, 2010, 14:28 »

Что хранится в MyObject и какая задача возлагается на сигнал?
Есть класс AA, работающий асинхронно. В некоторые моменты времени этот класс инициирует сигнал с данными, обрабатываемый слотом класса BB, агрегирующий экземпляр AA. Класс BB парсит полученные данные и представляет их ввиде полиморфных объектов MyObject и сигнализирует об этом основному приложению, что появились данные, передавая их.
Записан
Dendy
Гость
« Ответ #4 : Январь 16, 2010, 14:39 »

Если тип соединения Qt::DirectConnection или Qt::QueuedBlockingConnection, то можно просто передавать указатель - он передастся синхронно, как будто просто вызвали метод с указателем в качестве аргумента. Если нужно обеспечить копирование, автоматическое удаление и потокобезопастность данных - заверните их в QSharedDataPointer.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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