C2665:'QObject::connect':3 个重载都无法转换所有参数类型

C2665: 'QObject::connect' : none of the 3 overloads could convert all the arguments types

本文关键字:转换 类型 参数 connect QObject C2665 重载      更新时间:2023-10-16

main

中有以下代码
         QProcess process;
        QObject::connect(&process, &QProcess::error, [](QProcess::ProcessError error)
        {
            qDebug() << error;
        }, Qt::QueuedConnection);
        bool launched = process.startDetached("D:temp.exe");

在编译

时产生这个错误
    D:main.cpp:5: error: C2665: 'QObject::connect' : none of the 3 overloads could convert all the argument types c:qt5.3msvc2013_64includeqtcoreqobject.h(205): could be 
'QMetaObject::Connection QObject::connect(const QObject *,const char
    *,const char *,Qt::ConnectionType) const' c:qt5.3msvc2013_64includeqtcoreqobject.h(201): or 
      'QMetaObject::Connection QObject::connect(const QObject *,const QMetaMethod &,const QObject *,const QMetaMethod &,Qt::ConnectionType)' c:qt5.3msvc2013_64includeqtcoreqobject.h(198): or      
 'QMetaObject::Connection QObject::connect(const QObject *,const char
    *,const QObject *,const char *,Qt::ConnectionType)' while trying to match the argument list '(QProcess *, overloaded-function, RunGUIMode::<lambda_5d6e7ee926a623cea2a0e4469253d55f>, Qt::ConnectionType)'

谁能帮帮我,告诉我我做错了什么

我想从QProcess类连接一个信号到lambda

我不应该张贴这个答案,但说实话,这不是同一个问题,它更复杂。

首先,为什么第一个版本不行。因为如果不提供receiver,就不能使用附加参数(连接类型)。这意味着next是错误的。

connect(&process, static_cast<void (QProcess::*)(QProcess::ProcessError)>
        (&QProcess::error),[=](QProcess::ProcessError pError) {
        qWarning() << "error " << pError;
},Qt::QueuedConnection);

但下一个是正确的:

connect(&process, static_cast<void (QProcess::*)(QProcess::ProcessError)>
        (&QProcess::error), this , [=](QProcess::ProcessError pError) {
        qWarning() << "error " << pError;
},Qt::QueuedConnection);

如果你想知道为什么,看看qobject.h。我在这个文件中做了一些更改,只是为了更准确(不要更改这个文件!)

//first
//connect to a functor
template <typename Func1, typename Func2>
static inline typename QtPrivate::QEnableIf<QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1, QMetaObject::Connection>::Type
connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, Func2 slot)
{
    qDebug("There is no here argument for connection, isn't it?");
    return connect(sender, signal, sender, slot, Qt::DirectConnection);
}
//second
//connect to a functor, with a "context" object defining in which event loop is going to be executed
template <typename Func1, typename Func2>
static inline typename QtPrivate::QEnableIf<QtPrivate::FunctionPointer<Func2>::ArgumentCount == -1, QMetaObject::Connection>::Type
connect(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal, const QObject *context, Func2 slot,
        Qt::ConnectionType type = Qt::AutoConnection)
{
    qDebug("This will be called, and as you can see you need specify the context if you want to use connection type.");
    //...
其次,当你运行这段代码时,你会得到:

QObject::connect:不能将类型的参数排队'QProcess::ProcessError'(确保'QProcess::ProcessError'是注册使用qRegisterMetaType().)

所以需要在连接前添加qRegisterMetaType<QProcess::ProcessError>("QProcess::ProcessError");

所以最终版本是:

qRegisterMetaType<QProcess::ProcessError>("QProcess::ProcessError");
QProcess process;
connect(&process, static_cast<void (QProcess::*)(QProcess::ProcessError)>
        (&QProcess::error), this , [=](QProcess::ProcessError pError) {
    qWarning() << "error " << pError;
},Qt::QueuedConnection);
process.start("MyProgram");
bool launched = process.startDetached("example");