Как вы заметили, код ниже отчета об ошибке выполнения отчетов несовместимость между signal
и slot
:
QObject::connect(&c, SIGNAL(value(A::B*)), &a, SLOT(onValue(B*)));
Ошибка:
QObject :: подключить: Несовместимые аргументы отправителя/приемника C: : значение (A :: B *) -> A :: onValue (B *)
Это потому что SIGNAL
и SLOT
являются макросами, и совместимость вызовов разрешается во время выполнения и не выполняется в этом случае, когда он должен работать, поскольку A::B
и B
такие же (скорее всего, это, по-видимому, простое сравнение текста).
Но это команда соединения старого стиля (pre Qt5).
С новой командой подключения стиль:
QObject::connect(&c, &C::value, &a, &A::onValue);
ошибка не сообщается во время компиляции, ни во время выполнения, и соединение будет работать.
B является частным в области A, поэтому вы не можете использовать его снаружи. Вы можете сделать небезопасную вещь и использовать указатель void, а затем отбросить ее на указатель B в слот. Но, видя, что B является частным, нет никакого возможного способа испускать откуда угодно, кроме как внутри A. – dtech
@ddrire жаль, что это была опечатка: B является публичной. –
Что такое сообщение об ошибке? Мне кажется, что типы действительно совместимы. – goug