C2665:'QObject::connect':3 个重载都无法转换所有参数类型
C2665: 'QObject::connect' : none of the 3 overloads could convert all the arguments types
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");
相关文章:
- 无法转换类型 C++
- 包含可变参数包的第一个可转换类型的别名的结构
- 将 std::conditional 与不可转换类型(原始与指针)一起使用
- 链接方法时出现转换类型错误
- 如何避免隐式转换类型
- 在多重继承场景中动态强制转换类型
- 编译器不支持的转换类型
- 错误调用功能无法转换类型
- 我想看到一个在整个后缀表达式的上下文中查找转换类型 id 的示例
- 对于动态类型为强制转换类型的对象,dynamic_cast失败
- 无法在初始化中转换类型
- 如何让"auto"转换类型
- 如何通过强制转换类型指针将字符数组转换为uint16_t
- 如何从新运算符+(Template类)返回具有转换类型的对象
- 带有模板的基于枚举的工厂无法转换类型
- 使用SWIG类型映射通过字符串转换类型
- 对于可转换类型,设计比循环依赖项更好
- SWIG不能正确转换类型定义
- 将类型转换扩展到可转换类型的对/元组
- 想要将字符数组的部分转换/类型转换为值