Сигналы слоты qt

170
30 января 2019, 20:20

Задача состоит в том, что есть два класса. В экземпляре одного из принимаются на вход данные (например чтение из файла) и после обработки передается в экземпляр другого класса. Первый класс, который формирует и передает данные наследуется от QThread. Второй является наследником QWidget. В итоге при использовании сигнально-слотового соединения в консоль выдается следующее сообщение.

QObject::connect: Cannot queue arguments of type 'QByteArray&' (Make sure 'QByteArray&' is registered using qRegisterMetaType().)

Сигнал первого класса:

void sendBytes(QByteArray& arr);

Слот второго класса:

void receiveBytes(QByteArray&);

Соединение:

connect(ctch, SIGNAL(sendBytes(QByteArray&)), this, SLOT(receiveBytes(QByteArray&)));
Answer 1

Наследоваться от QThread плохо, читайте как правильно делать в Threads Events QObjects. Конкретно по Вашей ошибке: Вы передаёте lvalue-ссылку сквозь потоки, что крайне небезопасно. Qt не может упаковать такую ссылку и передать в другой поток, отсюда и ошибка. Используйте ссылку на константу или передачу по значению.

Answer 2

QByteArray является implicit sharing классом. Это означает что данный класс является оберткой вокруг указателя с подсчетом ссылок, реализующий поведение copy-on-write. При создании экземпляра-копии увеличивается счетчик ссылок. При изменении содержимого создается новая полная копия объекта с вносимыми изменениями для экземпляра где вносятся изменения, все остальные экземпляры не изменяются. Экземпляры классов с подсчетом ссылок бессмысленно передавать по ссылке, т.к. экономии при этом не достигается.

Передавайте QByteArray по значению

READ ALSO
Одинаковые байты, разные представления

Одинаковые байты, разные представления

Могут ли существовать две строки std::string a и std::string b, для которых a == b возвращает true, но они имеют разный вид при std::cout << a << b?

208
Можете объяснить смысл задачи?

Можете объяснить смысл задачи?

Ильнар в одной из комнат увидел странного роботаВо время выполнения алгоритма, он доставал из мешка разные камушки

186
Возврат указателя из метода

Возврат указателя из метода

Несколько вопросов по этому коду:

190
Преобразование List в другой List

Преобразование List в другой List

Есть две сущности:

246