Russian Qt Forum

Qt => Общие вопросы => Тема начата: billygates от Январь 15, 2010, 16:23



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

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

Спасибо.


Название: Re: Как правильно передавать объекты в слот?
Отправлено: BRE от Январь 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.


Название: Re: Как правильно передавать объекты в слот?
Отправлено: Dendy от Январь 15, 2010, 17:49
Что хранится в MyObject и какая задача возлагается на сигнал?


Название: Re: Как правильно передавать объекты в слот?
Отправлено: billygates от Январь 16, 2010, 14:28
Что хранится в MyObject и какая задача возлагается на сигнал?
Есть класс AA, работающий асинхронно. В некоторые моменты времени этот класс инициирует сигнал с данными, обрабатываемый слотом класса BB, агрегирующий экземпляр AA. Класс BB парсит полученные данные и представляет их ввиде полиморфных объектов MyObject и сигнализирует об этом основному приложению, что появились данные, передавая их.


Название: Re: Как правильно передавать объекты в слот?
Отправлено: Dendy от Январь 16, 2010, 14:39
Если тип соединения Qt::DirectConnection или Qt::QueuedBlockingConnection, то можно просто передавать указатель - он передастся синхронно, как будто просто вызвали метод с указателем в качестве аргумента. Если нужно обеспечить копирование, автоматическое удаление и потокобезопастность данных - заверните их в QSharedDataPointer.