qt5: подключить сигнал перегрузки и функцию слота с помощью static_cast

Моя среда: Qt5.5 + QtCreator3.5 + OSX10.11

Я знаю, что синтаксис функции connect в qt5 и qt4 отличается, и посмотрите документ, чтобы выяснить, как использовать connect() в qt5 для работы с перегрузкой функции сигнала/слота.

Я делаю, как предлагают, но это все еще не работает.

newspaper.h

signals:
    // overload function
    void newPaper(const QString &name) const;
    void newPaper(const QString &name, const QDate &date) const;

reader.h

//overload function
void receiveNewspaper(const QString &name) const
{
    qDebug() << "overload(name): Receives Newspaper: " << name;
}
//overload function
void receiveNewspaper(const QString &name, const QDate &date) const
{
    qDebug() << "overload(name, date): Receives Newspaper: " << name << "\tDate:" << date;
}

main.cpp

//connect for overload signal,slot function
QObject::connect(&newspaper,
                 static_cast<void (Newspaper:: *)(const QString &)>(&Newspaper::newPaper),
                 &reader,
                 static_cast<void (Reader:: *)(const QString &)>(&Reader::receiveNewspaper) );

Но он получает ошибку следующим образом

./2_16_SignalSlotDeep/main.cpp:16:22: error: address of overloaded function 'newPaper' cannot be static_cast to type 'void (Newspaper::*)(const QString &)'
                     static_cast<void (Newspaper::*)(const QString &)>(&Newspaper::newPaper),
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../2_16_SignalSlotDeep/newspaper.h:28:10: note: candidate function
    void newPaper(const QString &name) const;
         ^
../2_16_SignalSlotDeep/newspaper.h:29:10: note: candidate function
    void newPaper(const QString &name, const QDate &date) const;
         ^
../2_16_SignalSlotDeep/main.cpp:18:22: error: address of overloaded function 'receiveNewspaper' cannot be static_cast to type 'void (Reader::*)(const QString &)'
                     static_cast<void (Reader::*)(const QString &)>(&Reader::receiveNewspaper) );
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../2_16_SignalSlotDeep/reader.h:16:10: note: candidate function
    void receiveNewspaper(const QString &name) const
         ^
../2_16_SignalSlotDeep/reader.h:21:10: note: candidate function
    void receiveNewspaper(const QString &name, const QDate &date) const

Я уже искал другие вопросы, которые мне не помогают. Как это исправить? Ваш совет будет оценен.

ссылка на другой вопрос1

ссылка на другой вопрос2


person Jerry    schedule 30.05.2016    source источник
comment
Может быть полезно следующее: stackoverflow.com/a/26422155/1421332   -  person Silicomancer    schedule 06.06.2016


Ответы (1)


Вы не можете отказаться от «const» ваших сигналов, используя static_cast. Попробуйте удалить "const" позади ваших сигналов.

Обычно сигналы не должны быть константными, потому что они обычно испускаются неконстантными методами.

person Silicomancer    schedule 03.06.2016
comment
После удаления const, стоящего за моими методами перегрузки сигналов/слотов, все заработало нормально. Спасибо за помощь. - person Jerry; 06.06.2016