2015-02-13 2 views
0

Так что я пытаюсь использовать Qt-сигналы и слоты для передачи изображения через smart_ptr, чтобы он удалялся, когда все, что нужно использовать данные, Это.Qt Сигналы и слоты с Boost :: smart_ptr

Вот код, у меня есть:

класса А, наследует QObject:

signals: 
void newImageSent(boost::shared_ptr<namespace::ImageData> &image); 

класса B, наследует QObject: Код

public slots: 
void newImageRecieved(boost::shared_ptr<namespace::ImageData> &image) 
{ 
// Manipulate Image 
} 

соединения:

QObject::connect(classAPtr.get(), 
SIGNAL(newImageSent(boost::shared_ptr<namespace::ImageData>)), 
classBPtr.get(), 
SLOT(newImageRecieved(boost::shared_ptr<namespace::ImageData>)), 
Qt::QueuedConnection); 

Когда я пытаюсь d o соединение всегда возвращает false, хотя, есть ли что-то, чего я не вижу?

+0

Что Qt версии вы используете? – mfuchs

+1

Является ли ссылка non-const специально? Это почти никогда не имеет смысла для соединений с сигналом/слотом. Используйте const ref. если это действительно нецелесообразно. –

ответ

3

В очередном соединении сигнал помещается в очередь в цикле событий и его параметры копируются. Следовательно, слот не выполняется напрямую. Для возможности копирования возможно зарегистрировать тип через qRegisterMetaType, см. Также here.

Поскольку вы используете общие указатели, самым простым решением было бы передавать их по значению, тогда вам не пришлось бы беспокоиться о ссылках, как указал Фрэнк Остерфелд.

Способ создания соединения основан на строках и, как результат, легко ошибиться, особенно при использовании пространств имен. Использование typedef облегчит боль и облегчит обнаружение ошибок. Например, вы могли бы сделать

typedef boost::shared_ptr<namespace::ImageData> ImageDataPtr; 

и использовать ImageDataPtr с тех пор. Особенно при регистрации типа в виде мета-типа, который вы должны выполнять, так как вы используете очередь в очереди.

Если вы используете Qt5, то вы можете рассчитывать на новый синтаксис соединения, который обеспечивает корректность во время компиляции, как она не опирается на сравнение строк:

QObject::connect(classAPtr.get(), &A::newImageSent, 
       classBPtr.get(), &B::newImageRecieved, 
       Qt::QueuedConnection); 
Смежные вопросы