Тогда ты будешь передавать дескриптор файла/указатель на данные или ещё что, а не сам объект. Ведь сигналы-слоты - это просто функции, а стек сравнительно маленький, около 1Мб.
Через сигнал можно передать произвольный объект. При передаче для него ЕМНИП будет вызван конструктор копирования. Так что я не особо понимаю зачем передавать что-то больше трёх слов не по ссылке или через какой-нибудь хитрый умный указатель (а половина Qt-шных не QObject'ов и есть хитрый указатель на массив байт).
Если мыслить на уровне метакомпиляции Qt. В некоторых случаях, сигнал, это вызов метода, который делает прямой вызов метода слота. Да это грубо. Как и грубо то, что иногда emit — это пустая строка.
Отсюда вопрос C++ разработчику, который знает как работает железо. Какой максимальный размер данных при вызове метода? Зависит от ОС и сколько размера стека она выделяет(«stack overflow»). А если через указатели то там неважно. Это не DBus, где какие-то ограничения встречаются.
Всё qt-структуры данных (включая domxml, строки, bytearray) имеют COW, поэтому их можно передавать по значению, это не будет приводить к копированию. Вот копирование этих 10гб при случайном изменении может стать проблемой.
Например, ты можешь передать хоть два гигабайта пи помощи QByteArray через сигнал-слот, ведь данные при передаче этих объектов копироваться не будут, в Qt действует механизм copy-on-write, т.е. копирование только тогда, когда объект будет модифицироваться.
On the plus side, Qt containers are implicitly shared, so copies are shallow. In contrast, all STL containers except std::string are required to use deep copy.