Использование std::function в качестве аргумента для сигнала или слота.



  • Здравствуйте.
    Как передать объект std::function в качестве аргумента для слота и сигнала?

    Пример кода:

    signals:
        void sendSetProcFunc(const std::function<void (const QImage &,
                                                   QList<QPolygon> &,
                                                   QList<QImage> &)>
                         &procFunc);
    
    ...................................
    public slots:
        void onSetProcFunc(const std::function<void (const QImage &,
                                                   QList<QPolygon> &,
                                                   QList<QImage> &)>
                         &procFunc);
    

    При сборке в Qt 5.7 с компилятором MinGW_32bit выдаёт следующие ошибки:


    debug\moc_QtCVGUI.cpp: In static member function 'static void QtCVGUI::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)':
    debug\moc_QtCVGUI.cpp:131:128: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
    case 2: _t->sendSetProcFunc((reinterpret_cast< const std::function<const void( QImage&,QList<QPolygon>&,QList<QImage>&)>()>(_a[1]))); break;
    ^
    debug\moc_QtCVGUI.cpp:131:142: error: no matching function for call to 'QtCVGUI::sendSetProcFunc(const std::function<const void(QImage&, QList<QPolygon>&, QList<QImage>&)>&)'
    case 2: _t->sendSetProcFunc((reinterpret_cast< const std::function<const void( QImage&,QList<QPolygon>&,QList<QImage>&)>()>(_a[1]))); break;
    ^
    In file included from debug\moc_QtCVGUI.cpp:9:0:
    ****/QtCVGUI.h:49:10: note: candidate: void QtCVGUI::sendSetProcFunc(const std::function<void(const QImage&, QList<QPolygon>&, QList<QImage>&)>&)
    void sendSetProcFunc(const std::function<void (const QImage &,
    ^
    ****/QtCVGUI.h:49:10: note: no known conversion for argument 1 from 'const std::function<const void(QImage&, QList<QPolygon>&, QList<QImage>&)>' to 'const std::function<void(const QImage&, QList<QPolygon>&, QList<QImage>&)>&'


    Удаление всех const и передача std::function как обычной переменной (НЕ ссылкой) помогает решить проблему (т.е. успешно собрать).
    Но почему такие ограничения и как их можно обойти?

    void sendSetProcFunc(std::function<void (QImage &,
                                                   QList<QPolygon> &,
                                                   QList<QImage> &)>
                         procFunc);
    

    Посты на английском:
    https://forum.qt.io/topic/78860/using-std-function-as-parameter-for-slot-and-signal/6
    https://bugreports.qt.io/browse/QTBUG-60539


Log in to reply