更新我们的信号/插槽功能时,我们遇到了未定义的问题.这是我们收到的错误:
这是以前的工作,没有问题,工作得很好:
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);
record.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: templatestatic QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer ::Object*, Func1, const typename QtPrivate::FunctionPointer ::Object*, Func2, Qt::ConnectionType) static inline QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer ::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 static QMetaObject::Connection QObject::connect(const typename QtPrivate::FunctionPointer ::Object*, Func1, const typename QtPrivate::FunctionPointer ::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 ' \Qt\5.5\mingw492_32\include/QtCore/qobject.h:245:13: note: template static typename QtPrivate::QEnableIf<((int)(QtPrivate::FunctionPointer ::ArgumentCount) >= 0), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer ::Object*, Func1, Func2) connect(const typename QtPrivate::FunctionPointer ::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 static typename QtPrivate::QEnableIf<(((int)(QtPrivate::FunctionPointer ::ArgumentCount) >= 0) && (! QtPrivate::FunctionPointer ::IsPointerToMemberFunction)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer ::Object*, Func1, const QObject*, Func2, Qt::ConnectionType) connect(const typename QtPrivate::FunctionPointer ::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 static typename QtPrivate::QEnableIf<(((int)(QtPrivate::FunctionPointer ::ArgumentCount) >= 0) && (! QtPrivate::FunctionPointer ::IsPointerToMemberFunction)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer ::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 ' 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 ' template 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 static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer ::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer ::Object*, Func1, Func2) connect(const typename QtPrivate::FunctionPointer ::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 static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer ::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer ::Object*, Func1, const QObject*, Func2, Qt::ConnectionType) connect(const typename QtPrivate::FunctionPointer ::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 static typename QtPrivate::QEnableIf<(QtPrivate::FunctionPointer ::ArgumentCount == (-1)), QMetaObject::Connection>::Type QObject::connect(const typename QtPrivate::FunctionPointer ::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
我们只添加了一个布尔值,将其添加到信号以及相应的插槽中,现在我们不知道为什么它突然不再起作用了.
我在这个页面上看过:http: //doc.qt.io/qt-5/signalsandslots.html
"如果您的编译器不支持C++ 11可变参数模板,则只有当信号和插槽有6个或更少的参数时,此语法才有效."
在上面的语句中,"此语法"是您正在使用的新连接语法.
好像你的信号槽现在有7个参数.这可能是问题的潜在原因.
只需要仔细检查就可以使用旧的信号槽连接语法(带有SIGNAL和SLOT宏的语法).
在.pro文件中使其工作所需的更改:
CONFIG += c++11