2015-12-02 2 views
3

При обновлении нашей функции Signal/Slot мы сталкиваемся с неопределенными проблемами. Это ошибка, мы получим:Нет соответствующей функции для вызова для подключения - Qt 5.5


Это то, что было раньше, работая все нормально без проблем:

mainwindow.cpp

connect(_restrict, &Restrict::windowChanged, _record, &Record::onWindowChanged); 

mainwindow.h:

private slots: 
void onWindowChanged(QDateTime current, QString processName, QString windowTitle, QString url, long prevPID, long currPID); 

запись.h:

public slots: 
void onWindowChanged(QDateTime time, QString processName, QString windowTitle, QString url, long prevPID, long currPid); 

restrict.h:

signals: 
void windowChanged(QDateTime time, QString processName, QString windowTitle, QString url = "", long prevPID = -1, long currPid = -1); 

Наши данные после изменения:

mainwindow.cpp

connect(_restrict, &Restrict::windowChanged, _record, &Record::onWindowChanged); 

mainwindow.h:

private slots: 
void onWindowChanged(QDateTime current, QString processName, QString windowTitle, QString url, long prevPID, long currPID, bool whitelisted); 

record.h:

public slots: 
void onWindowChanged(QDateTime time, QString processName, QString windowTitle, QString url, long prevPID, long currPid, bool whitelisted); 

restrict.h:

signals: 
void windowChanged(QDateTime time, QString processName, QString windowTitle, QString url = "", long prevPID = -1, long currPid = -1, bool whitelisted = false); 

Ошибки придумывают:

\mainwindow.cpp:84:91: error: no matching function for call to 'MainWindow::connect(Restrict*&, void (Restrict::*)(QDateTime, QString, QString, QString, long int, long int, bool), Record*&, void (Record::*)(QDateTime, QString, QString, QString, long int, long int, bool))' 
      connect(_restrict, &Restrict::windowChanged, _record, &Record::onWindowChanged); 
                         ^
\mainwindow.cpp:84:91: note: candidates are: 
In file included from \Qt\5.5\mingw492_32\include/QtCore/qabstractanimation.h:37:0, 
       from \Qt\5.5\mingw492_32\include/QtCore/QtCore:4, 
       from \Qt\5.5\mingw492_32\include/QtWidgets/QtWidgetsDepends:3, 
       from \Qt\5.5\mingw492_32\include\QtWidgets/QtWidgets:3, 
       from \mainwindow.cpp:1: 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:196:36: note: static QMetaObject::Connection QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType) 
    static QMetaObject::Connection connect(const QObject *sender, const char *signal, 
            ^
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:196:36: note: no known conversion for argument 2 from 'void (Restrict::*)(QDateTime, QString, QString, QString, long int, long int, bool)' to 'const char*' 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:199:36: note: static QMetaObject::Connection QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType) 
    static QMetaObject::Connection connect(const QObject *sender, const QMetaMethod &signal, 
            ^
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:199:36: note: no known conversion for argument 2 from 'void (Restrict::*)(QDateTime, QString, QString, QString, long int, long int, bool)' to 'const QMetaMethod&' 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:475:32: note: QMetaObject::Connection QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const 
inline QMetaObject::Connection QObject::connect(const QObject *asender, const char *asignal, 
           ^
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:475:32: note: no known conversion for argument 2 from 'void (Restrict::*)(QDateTime, QString, QString, QString, long int, long int, bool)' to 'const char*' 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:213:43: note: template<class Func1, class Func2> static QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const typename QtPrivate::FunctionPointer<Func2>::Object*, Func2, Qt::ConnectionType) 
    static inline QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, 
             ^
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:213:43: note: template argument deduction/substitution failed: 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h: In substitution of 'template<class Func1, class Func2> static QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const typename QtPrivate::FunctionPointer<Func2>::Object*, Func2, Qt::ConnectionType) [with Func1 = void (Restrict::*)(QDateTime, QString, QString, QString, long int, long int, bool); Func2 = void (Record::*)(QDateTime, QString, QString, QString, long int, long int, bool)]': 
\mainwindow.cpp:84:91: required from here 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:213:43: error: no type named 'Object' in 'struct QtPrivate::FunctionPointer<void (Record::*)(QDateTime, QString, QString, QString, long int, long int, bool)>' 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:245:13: note: template<class Func1, class Func2> static typename QtPrivate::QEnableIf<((int)(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, Func2) 
      connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot) 
      ^
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:245:13: note: template argument deduction/substitution failed: 
\mainwindow.cpp:84:91: note: candidate expects 3 arguments, 4 provided 
      connect(_restrict, &Restrict::windowChanged, _record, &Record::onWindowChanged); 
                         ^
In file included from \Qt\5.5\mingw492_32\include/QtCore/qabstractanimation.h:37:0, 
       from \Qt\5.5\mingw492_32\include/QtCore/QtCore:4, 
       from \Qt\5.5\mingw492_32\include/QtWidgets/QtWidgetsDepends:3, 
       from \Qt\5.5\mingw492_32\include\QtWidgets/QtWidgets:3, 
       from \mainwindow.cpp:1: 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:254:13: note: template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(((int)(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0) && (! QtPrivate::FunctionPointer<Func2>::IsPointerToMemberFunction)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const QObject*, Func2, Qt::ConnectionType) 
      connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot, 
      ^
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:254:13: note: template argument deduction/substitution failed: 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h: In substitution of 'template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(((int)(QtPrivate::FunctionPointer<Func2>::ArgumentCount) >= 0) && (! QtPrivate::FunctionPointer<Func2>::IsPointerToMemberFunction)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const QObject*, Func2, Qt::ConnectionType) [with Func1 = void (Restrict::*)(QDateTime, QString, QString, QString, long int, long int, bool); Func2 = void (Record::*)(QDateTime, QString, QString, QString, long int, long int, bool)]': 
\mainwindow.cpp:84:91: required from here 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:254:13: error: invalid use of incomplete type 'struct QtPrivate::QEnableIf<false, QMetaObject::Connection>' 
In file included from \Qt\5.5\mingw492_32\include/QtCore/qnamespace.h:37:0, 
       from \Qt\5.5\mingw492_32\include/QtCore/qobjectdefs.h:41, 
       from \Qt\5.5\mingw492_32\include/QtCore/qobject.h:40, 
       from \Qt\5.5\mingw492_32\include/QtCore/qabstractanimation.h:37, 
       from \Qt\5.5\mingw492_32\include/QtCore/QtCore:4, 
       from \Qt\5.5\mingw492_32\include/QtWidgets/QtWidgetsDepends:3, 
       from \Qt\5.5\mingw492_32\include\QtWidgets/QtWidgets:3, 
       from \mainwindow.cpp:1: 
\Qt\5.5\mingw492_32\include/QtCore/qglobal.h:1073:45: error: declaration of 'struct QtPrivate::QEnableIf<false, QMetaObject::Connection>' 
template <bool B, typename T = void> struct QEnableIf; 
              ^
In file included from \Qt\5.5\mingw492_32\include/QtCore/qabstractanimation.h:37:0, 
       from \Qt\5.5\mingw492_32\include/QtCore/QtCore:4, 
       from \Qt\5.5\mingw492_32\include/QtWidgets/QtWidgetsDepends:3, 
       from \Qt\5.5\mingw492_32\include\QtWidgets/QtWidgets:3, 
       from \mainwindow.cpp:1: 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:285:13: note: template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, Func2) 
      connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot) 
      ^
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:285:13: note: template argument deduction/substitution failed: 
\mainwindow.cpp:84:91: note: candidate expects 3 arguments, 4 provided 
      connect(_restrict, &Restrict::windowChanged, _record, &Record::onWindowChanged); 
                         ^
In file included from \Qt\5.5\mingw492_32\include/QtCore/qabstractanimation.h:37:0, 
       from \Qt\5.5\mingw492_32\include/QtCore/QtCore:4, 
       from \Qt\5.5\mingw492_32\include/QtWidgets/QtWidgetsDepends:3, 
       from \Qt\5.5\mingw492_32\include\QtWidgets/QtWidgets:3, 
       from \mainwindow.cpp:1: 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:293:13: note: template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const QObject*, Func2, Qt::ConnectionType) 
      connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot, 
      ^
\Qt\5.5\mingw492_32\include/QtCore/qobject.h:293:13: note: template argument deduction/substitution failed: 
\Qt\5.5\mingw492_32\include/QtCore/qobject.h: In substitution of 'template<class Func1, class Func2> static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer<Func2>::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer<Func>::Object*, Func1, const QObject*, Func2, Qt::ConnectionType) [with Func1 = void (Restrict::*)(QDateTime, QString, QString, QString, long int, long int, bool); Func2 = void (Record::*)(QDateTime, QString, QString, QString, long int, long int, bool)]': 
\mainwindow.cpp:84:91: required from here 

Мы только добавили одно булево значение, добавил его сигнал, а также соответствующий слот, и теперь мы понятия не имеем, почему это sudd enly больше не работает.

+2

Вы можете оставить [MCVE] (http://stackoverflow.com/help/mcve) так, чтобы другие могли воспроизвести и помогите? – ray

+0

Спасибо за ссылку. Я сделаю это для следующего вопроса, который у меня есть. –

ответ

5

Я прочитал на этой странице: http://doc.qt.io/qt-5/signalsandslots.html

«если ваш компилятор не поддерживает C++ 11 VARIADIC шаблонов, этот синтаксис работает только если сигнал и слот имеют 6 аргументов или меньше.»

В приведенном выше описании «этот синтаксис» - это новый синтаксис соединения, который вы используете.

Кажется, что ваш сигнальный слот имеет 7 аргументов. Это может быть потенциальной причиной проблемы.

Для двойной проверки вы можете использовать синтаксис соединения старого слота сигнала (тот, у которого есть макросы SIGNAL и SLOT).

изменения, необходимые, чтобы сделать его работу в файл .pro:

CONFIG += c++11

+0

Ты бог. Большое спасибо! –

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