2017-02-08 3 views
0

Учитывая два заголовка из внешнего SDK,Qt сигнала слоты Типы видимости класса

class A 
{ 
    public: 
    class B 
    { 
    }; 
    public slots: 
    void onValue(B* b); 
}; 

class C 
{ 
    signal: 
    void value(A::B* b); 
}; 

Вопрос заключается в том, как я могу подключить сигнал и слоты C -> A, так как типы данных принимаются как несовместимые во времени выполнения ,

+0

B является частным в области A, поэтому вы не можете использовать его снаружи. Вы можете сделать небезопасную вещь и использовать указатель void, а затем отбросить ее на указатель B в слот. Но, видя, что B является частным, нет никакого возможного способа испускать откуда угодно, кроме как внутри A. – dtech

+0

@ddrire жаль, что это была опечатка: B является публичной. –

+0

Что такое сообщение об ошибке? Мне кажется, что типы действительно совместимы. – goug

ответ

2

Как вы заметили, код ниже отчета об ошибке выполнения отчетов несовместимость между 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); 

ошибка не сообщается во время компиляции, ни во время выполнения, и соединение будет работать.

+0

Благодарим вас за ответ и укажем на новый стиль Qt. –

Смежные вопросы