请教一个关于qt 信号槽槽的问题

您现在正在浏览:
本人刚学Qt,在信号与槽部分遇到问题,求大神解答
发布时间:
02:32:08 &
浏览次数:
本人刚学Qt,在信号与槽部分遇到问题,求大神解答
#include &QtCore/QCoreApplication&
#include &iostream&
class Foo:public QObject
{
Q_OBJECT
public:
Foo();
int value() const
{
}
public slots:
void setValue(int);
signals:
void valueChange(int);
private:
};
Foo::Foo()
{
val=0;
}
void Foo::setValue(int v)
{
if(v!=val)
{
val=v;
emit valueChange(v);
}
}
int main(int argc, char *argv[])
{
QCoreApplication c(argc, argv);
Foo a,b;
QObject::connect(&a,SIGNAL(valueChange(int)),&b,SLOT(setValue(int)));
b.setValue(11);
a.setValue(79);
cout&&a.value();
return c.exec();
}
在VS2010中使用Qt4.8.5中出现以下错误:
已启动生成: 项目: signalAndSlot, 配置: Debug Win32 ------
1&C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(151,5): warning MSB8017: 针对项“GeneratedFiles\Debug\main.moc”执行自定义生成命令时检测到了循环依赖项。这可能会导致增量生成无法正确运行。
1&
Moc&ing main.cpp...
1&
main.cpp
1&main.obj : error LNK2001: 无法解析的外部符号 &public: virtual struct QMetaObject const * __thiscall Foo::metaObject(void)const & (metaObject@Foo@@UBEPBUQMetaObject@@XZ)
1&main.obj : error LNK2001: 无法解析的外部符号 &public: virtual void * __thiscall Foo::qt_metacast(char const *)& (qt_metacast@Foo@@UAEPAXPBD@Z)
1&main.obj : error LNK2001: 无法解析的外部符号 &public: virtual int __thiscall Foo::qt_metacall(enum QMetaObject::Call,int,void * *)& (qt_metacall@Foo@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1&main.obj : error LNK2019: 无法解析的外部符号 &protected: void __thiscall Foo::valueChange(int)& (valueChange@Foo@@IAEXH@Z),该符号在函数 &public: void __thiscall Foo::setValue(int)& (setValue@Foo@@QAEXH@Z) 中被引用
1&D:\QtProgram\signalAndSlot\Win32\Debug\\signalAndSlot.exe : fatal error LNK1120: 4 个无法解析的外部命令回答1:#include &QtCore/QCoreApplication&
#include &iostream&
class Foo:public QObject
{
Q_OBJECT
public:
Foo();
int value() const
{
}
public slots:
void setValue(int);
signals:
void valueChange(int);
private:
};
Foo::Foo()
{
val=0;
}
void Foo::setValue(int v)
{
if(v!=val)
{
val=v;
emit valueChange(v);
}
}
int main(int argc, char *argv[])
{
QCoreApplication c(argc, argv);
Foo a,b;
QObject::connect(&a,SIGNAL(valueChange(int)),&b,SLOT(setValue(int)));
b.setValue(11);
a.setValue(79);
cout&&a.value();
return c.exec();
}
在VS2010中使用Qt4.8.5中出现以下错误:
已启动生成: 项目: signalAndSlot, 配置: Debug Win32 ------
1&C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(151,5): warning MSB8017: 针对项“GeneratedFiles\Debug\main.moc”执行自定义生成命令时检测到了循环依赖项。这可能会导致增量生成无法正确运行。
1&
Moc&ing main.cpp...
1&
main.cpp
1&main.obj : error LNK2001: 无法解析的外部符号 &public: virtual struct QMetaObject const * __thiscall Foo::metaObject(void)const & (metaObject@Foo@@UBEPBUQMetaObject@@XZ)
1&main.obj : error LNK2001: 无法解析的外部符号 &public: virtual void * __thiscall Foo::qt_metacast(char const *)& (qt_metacast@Foo@@UAEPAXPBD@Z)
1&main.obj : error LNK2001: 无法解析的外部符号 &public: virtual int __thiscall Foo::qt_metacall(enum QMetaObject::Call,int,void * *)& (qt_metacall@Foo@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1&main.obj : error LNK2019: 无法解析的外部符号 &protected: void __thiscall Foo::valueChange(int)& (valueChange@Foo@@IAEXH@Z),该符号在函数 &public: void __thiscall Foo::setValue(int)& (setValue@Foo@@QAEXH@Z) 中被引用
1&D:\QtProgram\signalAndSlot\Win32\Debug\\signalAndSlot.exe : fatal error LNK1120: 4 个无法解析的外部命令
分享到:回答2:代码改自《Qt4图形设计与嵌入式开发》作者:丁林松 第10页,新手问题,请海涵回答3:把申明和实现分开到2个文件当中就行了。
具体原因:我觉得是因为Qt在编译的时候你只有当前文件的moc_XXX.cpp,
你申明了类,但是编译的时候编译器会去找你的cpp.但是你没有cpp。
编译器不会生成moc_Foo.cpp。
链接的时候就无法找到那些函数了。。回答4:引用 2 楼 kfbyj 的回复:把申明和实现分开到2个文件当中就行了。
具体原因:我觉得是因为Qt在编译的时候你只有当前文件的moc_XXX.cpp,
你申明了类,但是编译的时候编译器会去找你的cpp.但是你没有cpp。
编译器不会生成moc_Foo.cpp。
链接的时候就无法找到那些函数了。。
我分成Foo.h、Foo.c、main.c三个文件后又出现了:
1&------ 已启动生成: 项目: signalAndSlot2, 配置: Debug Win32 ------
1&
Moc&ing Foo.h...
1&
Foo.c
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(54): error C2061: 语法错误: 标识符“namespace”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(54): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(58): error C2054: 在“Qt”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1799): error C2143: 语法错误 : 缺少“)”(在“:”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1799): error C2143: 语法错误 : 缺少“{”(在“:”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1799): error C2059: 语法错误:“:”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1799): error C2059: 语法错误:“)”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1820): error C2061: 语法错误: 标识符“Q_CORE_EXPORT”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1820): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1820): error C2054: 在“QInternal”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(53): error C2061: 语法错误: 标识符“class”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(53): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(55): error C2061: 语法错误: 标识符“QString”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(55): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(143): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(143): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(146): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(146): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(217): error C2054: 在“Q_CORE_EXPORT”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(217): error C2085: “qFlagLocation”: 不在形参表中
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(249): error C2061: 语法错误: 标识符“class”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(250): error C2061: 语法错误: 标识符“QMetaMethod”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(250): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(251): error C2061: 语法错误: 标识符“QMetaEnum”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(251): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(252): error C2061: 语法错误: 标识符“QMetaProperty”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(252): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(253): error C2061: 语法错误: 标识符“QMetaClassInfo”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(253): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(256): error C2061: 语法错误: 标识符“Q_CORE_EXPORT”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(256): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(257): error C2054: 在“QGenericArgument”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(269): error C2061: 语法错误: 标识符“Q_CORE_EXPORT”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(269): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(269): error C2143: 语法错误 : 缺少“{”(在“:”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(269): error C2059: 语法错误:“:”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(277): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(277): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(285): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(285): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(295): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(295): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(305): error C2079: “QMetaObject”使用未定义的 struct“Q_CORE_EXPORT”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(305): error C2054: 在“QMetaObject”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(476): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(476): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(483): error C2143: 语法错误 : 缺少“;”(在“*”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(483): error C2059: 语法错误:“*”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(486): error C2143: 语法错误 : 缺少“)”(在“*”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(486): error C2143: 语法错误 : 缺少“{”(在“*”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(486): error C2059: 语法错误:“,”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(486): error C2059: 语法错误:“)”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(488): error C2061: 语法错误: 标识符“static_metacall”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(488): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(489): error C2059: 语法错误:“}”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(491): error C2054: 在“inline”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(491): error C2082: 形参“QMetaObject”的重定义
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(491): error C2143: 语法错误 : 缺少“;”(在“:”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(494): error C2143: 语法错误 : 缺少“{”(在“&cv-qualifer&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(494): error C2059: 语法错误:“&未知&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(53): error C2061: 语法错误: 标识符“class”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(53): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(57): error C2016: C 要求一个结构或联合至少有一个成员
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(57): error C2061: 语法错误: 标识符“public”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(60): error C2054: 在“inline”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(60): error C2085: “toLatin1”: 不在形参表中
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(60): error C2143: 语法错误 : 缺少“;”(在“&cv-qualifer&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(60): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(61): error C2143: 语法错误 : 缺少“{”(在“&cv-qualifer&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(61): error C2059: 语法错误:“&未知&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(67): error C2143: 语法错误 : 缺少“{”(在“:”的前面)
clude\qtcore\../../src/corelib/tools/qchar.h(384): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(384): error C2059: 语法错误:“:”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(384): fatal error C1003: 错误计数超过 100;正在停止编译
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
解决不了了!!!回答5:初步感觉是在Vs2010中预编译的问题,才会出现
C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(151,5): warning MSB8017: 针对项“GeneratedFiles\Debug\main.moc”执行自定义生成命令时检测到了循环依赖项。这可能会导致增量生成无法正确运行
这个错误,但不知怎么设置VS2010回答6:引用 3 楼 xiaoyuan0314 的回复:Quote: 引用 2 楼 kfbyj 的回复:
把申明和实现分开到2个文件当中就行了。
具体原因:我觉得是因为Qt在编译的时候你只有当前文件的moc_XXX.cpp,
你申明了类,但是编译的时候编译器会去找你的cpp.但是你没有cpp。
编译器不会生成moc_Foo.cpp。
链接的时候就无法找到那些函数了。。
我分成Foo.h、Foo.c、main.c三个文件后又出现了:
1&------ 已启动生成: 项目: signalAndSlot2, 配置: Debug Win32 ------
1&
Moc&ing Foo.h...
1&
Foo.c
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(54): error C2061: 语法错误: 标识符“namespace”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(54): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(58): error C2054: 在“Qt”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1799): error C2143: 语法错误 : 缺少“)”(在“:”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1799): error C2143: 语法错误 : 缺少“{”(在“:”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1799): error C2059: 语法错误:“:”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1799): error C2059: 语法错误:“)”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1820): error C2061: 语法错误: 标识符“Q_CORE_EXPORT”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1820): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1820): error C2054: 在“QInternal”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(53): error C2061: 语法错误: 标识符“class”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(53): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(55): error C2061: 语法错误: 标识符“QString”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(55): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(143): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(143): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(146): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(146): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(217): error C2054: 在“Q_CORE_EXPORT”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(217): error C2085: “qFlagLocation”: 不在形参表中
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(249): error C2061: 语法错误: 标识符“class”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(250): error C2061: 语法错误: 标识符“QMetaMethod”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(250): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(251): error C2061: 语法错误: 标识符“QMetaEnum”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(251): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(252): error C2061: 语法错误: 标识符“QMetaProperty”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(252): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(253): error C2061: 语法错误: 标识符“QMetaClassInfo”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(253): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(256): error C2061: 语法错误: 标识符“Q_CORE_EXPORT”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(256): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(257): error C2054: 在“QGenericArgument”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(269): error C2061: 语法错误: 标识符“Q_CORE_EXPORT”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(269): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(269): error C2143: 语法错误 : 缺少“{”(在“:”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(269): error C2059: 语法错误:“:”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(277): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(277): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(285): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(285): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(295): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(295): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(305): error C2079: “QMetaObject”使用未定义的 struct“Q_CORE_EXPORT”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(305): error C2054: 在“QMetaObject”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(476): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(476): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(483): error C2143: 语法错误 : 缺少“;”(在“*”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(483): error C2059: 语法错误:“*”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(486): error C2143: 语法错误 : 缺少“)”(在“*”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(486): error C2143: 语法错误 : 缺少“{”(在“*”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(486): error C2059: 语法错误:“,”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(486): error C2059: 语法错误:“)”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(488): error C2061: 语法错误: 标识符“static_metacall”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(488): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(489): error C2059: 语法错误:“}”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(491): error C2054: 在“inline”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(491): error C2082: 形参“QMetaObject”的重定义
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(491): error C2143: 语法错误 : 缺少“;”(在“:”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(494): error C2143: 语法错误 : 缺少“{”(在“&cv-qualifer&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(494): error C2059: 语法错误:“&未知&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(53): error C2061: 语法错误: 标识符“class”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(53): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(57): error C2016: C 要求一个结构或联合至少有一个成员
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(57): error C2061: 语法错误: 标识符“public”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(60): error C2054: 在“inline”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(60): error C2085: “toLatin1”: 不在形参表中
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(60): error C2143: 语法错误 : 缺少“;”(在“&cv-qualifer&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(60): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(61): error C2143: 语法错误 : 缺少“{”(在“&cv-qualifer&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(61): error C2059: 语法错误:“&未知&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(67): error C2143: 语法错误 : 缺少“{”(在“:”的前面)
clude\qtcore\../../src/corelib/tools/qchar.h(384): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(384): error C2059: 语法错误:“:”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(384): fatal error C1003: 错误计数超过 100;正在停止编译
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
解决不了了!!!
//foo.h
#ifndef FOO_H
#define FOO_H
#include &QObject&
class Foo:public QObject
{
Q_OBJECT
public:
Foo();
int value() const
{
}
public slots:
void setValue(int);
signals:
void valueChange(int);
private:
};
#endif // FOO_H
//foo.cpp
#include &foo.h&
Foo::Foo()
{
val=0;
}
void Foo::setValue(int v)
{
if(v!=val)
{
val=v;
emit valueChange(v);
}
}
//main.cpp
#include &QtCore/QCoreApplication&
#include &foo.h&
#include &QDebug&
int main(int argc, char *argv[])
{
QCoreApplication c(argc, argv);
Foo a,b;
QObject::connect(&a,SIGNAL(valueChange(int)),&b,SLOT(setValue(int)));
b.setValue(11);
a.setValue(79);
qDebug()&&QString::number(b.value());
return c.exec();
}
我觉得不是那个问题,编译器应该是检测到你都用了槽setValue和信号valueChanged()。
又同时申明了a,b编译器怕你a信号触发了改变了b的值,但是b又触发valueChanged()信号,如果你b又关联了a。。会导致死循环。。回答7:引用 5 楼 kfbyj 的回复:Quote: 引用 3 楼 xiaoyuan0314 的回复:
Quote: 引用 2 楼 kfbyj 的回复:
把申明和实现分开到2个文件当中就行了。
具体原因:我觉得是因为Qt在编译的时候你只有当前文件的moc_XXX.cpp,
你申明了类,但是编译的时候编译器会去找你的cpp.但是你没有cpp。
编译器不会生成moc_Foo.cpp。
链接的时候就无法找到那些函数了。。
我分成Foo.h、Foo.c、main.c三个文件后又出现了:
1&------ 已启动生成: 项目: signalAndSlot2, 配置: Debug Win32 ------
1&
Moc&ing Foo.h...
1&
Foo.c
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(54): error C2061: 语法错误: 标识符“namespace”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(54): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(58): error C2054: 在“Qt”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1799): error C2143: 语法错误 : 缺少“)”(在“:”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1799): error C2143: 语法错误 : 缺少“{”(在“:”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1799): error C2059: 语法错误:“:”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1799): error C2059: 语法错误:“)”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1820): error C2061: 语法错误: 标识符“Q_CORE_EXPORT”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1820): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/global/qnamespace.h(1820): error C2054: 在“QInternal”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(53): error C2061: 语法错误: 标识符“class”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(53): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(55): error C2061: 语法错误: 标识符“QString”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(55): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(143): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(143): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(146): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(146): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(217): error C2054: 在“Q_CORE_EXPORT”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(217): error C2085: “qFlagLocation”: 不在形参表中
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(249): error C2061: 语法错误: 标识符“class”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(250): error C2061: 语法错误: 标识符“QMetaMethod”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(250): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(251): error C2061: 语法错误: 标识符“QMetaEnum”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(251): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(252): error C2061: 语法错误: 标识符“QMetaProperty”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(252): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(253): error C2061: 语法错误: 标识符“QMetaClassInfo”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(253): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(256): error C2061: 语法错误: 标识符“Q_CORE_EXPORT”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(256): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(257): error C2054: 在“QGenericArgument”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(269): error C2061: 语法错误: 标识符“Q_CORE_EXPORT”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(269): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(269): error C2143: 语法错误 : 缺少“{”(在“:”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(269): error C2059: 语法错误:“:”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(277): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(277): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(285): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(285): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(295): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(295): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(305): error C2079: “QMetaObject”使用未定义的 struct“Q_CORE_EXPORT”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(305): error C2054: 在“QMetaObject”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(476): error C2143: 语法错误 : 缺少“{”(在“&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(476): error C2059: 语法错误:“&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(483): error C2143: 语法错误 : 缺少“;”(在“*”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(483): error C2059: 语法错误:“*”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(486): error C2143: 语法错误 : 缺少“)”(在“*”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(486): error C2143: 语法错误 : 缺少“{”(在“*”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(486): error C2059: 语法错误:“,”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(486): error C2059: 语法错误:“)”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(488): error C2061: 语法错误: 标识符“static_metacall”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(488): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(489): error C2059: 语法错误:“}”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(491): error C2054: 在“inline”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(491): error C2082: 形参“QMetaObject”的重定义
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(491): error C2143: 语法错误 : 缺少“;”(在“:”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(494): error C2143: 语法错误 : 缺少“{”(在“&cv-qualifer&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/kernel/qobjectdefs.h(494): error C2059: 语法错误:“&未知&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(53): error C2061: 语法错误: 标识符“class”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(53): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(57): error C2016: C 要求一个结构或联合至少有一个成员
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(57): error C2061: 语法错误: 标识符“public”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(60): error C2054: 在“inline”之后应输入“(”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(60): error C2085: “toLatin1”: 不在形参表中
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(60): error C2143: 语法错误 : 缺少“;”(在“&cv-qualifer&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(60): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(61): error C2143: 语法错误 : 缺少“{”(在“&cv-qualifer&”的前面)
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(61): error C2059: 语法错误:“&未知&”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(67): error C2143: 语法错误 : 缺少“{”(在“:”的前面)
clude\qtcore\../../src/corelib/tools/qchar.h(384): error C2059: 语法错误:“;”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(384): error C2059: 语法错误:“:”
1&d:\qt\4.8.5\include\qtcore\../../src/corelib/tools/qchar.h(384): fatal error C1003: 错误计数超过 100;正在停止编译
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
解决不了了!!!
//foo.h
#ifndef FOO_H
#define FOO_H
#include &QObject&
class Foo:public QObject
{
Q_OBJECT
public:
Foo();
int value() const
{
}
public slots:
void setValue(int);
signals:
void valueChange(int);
private:
};
#endif // FOO_H
//foo.cpp
#include &foo.h&
Foo::Foo()
{
val=0;
}
void Foo::setValue(int v)
{
if(v!=val)
{
val=v;
emit valueChange(v);
}
}
//main.cpp
#include &QtCore/QCoreApplication&
#include &foo.h&
#include &QDebug&
int main(int argc, char *argv[])
{
QCoreApplication c(argc, argv);
Foo a,b;
QObject::connect(&a,SIGNAL(valueChange(int)),&b,SLOT(setValue(int)));
b.setValue(11);
a.setValue(79);
qDebug()&&QString::number(b.value());
return c.exec();
}
我觉得不是那个问题,编译器应该是检测到你都用了槽setValue和信号valueChanged()。
又同时申明了a,b编译器怕你a信号触发了改变了b的值,但是b又触发valueChanged()信号,如果你b又关联了a。。会导致死循环。。
解决了:
在Foo.h里面只能有成员函数声明,在Foo.cpp里面具体实现,而我在Foo.h里声明并实现了:
int value() const
{
}
导致了错误!!!
但不知道为甚么这么严格的要求格式,我平时写写C++程序就一个main.cpp,声明和实现都放在class里面也可以运行。这是为什么呢?
非常感谢@kfbyi的耐心教导回答8:我又发现那样写叫内联函数,现在问题解决了,分三个文件就可以解决问题,程序可跑,跟是不是内联没有关系
//Foo.h
#ifndef FOO_H
#define FOO_H
#include&QObject&
class Foo:public QObject
{
Q_OBJECT
public:
Foo();
inline int value() const
{
}
public slots:
void setValue(int);
signals:
void valueChange(int);
private:
};
#endif
//Foo.cpp
#include&Foo.h&
Foo::Foo()
{
val=0;
}
void Foo::setValue(int v)
{
if(v!=val)
{
val=v;
emit valueChange(v);
}
}
/*
int Foo::value() const
{
}
*/
//main.cpp
#include &QtCore/QCoreApplication&
#include&iostream&
#include &Foo.h&
int main(int argc, char *argv[])
{
QCoreApplication c(argc, argv);
Foo a,b;
QObject::connect(&a,SIGNAL(valueChange(int)),&b,SLOT(setValue(int)));
b.setValue(11);
std::cout&&a.value()&&std::
std::cout&&b.value()&&std::
a.setValue(79);
std::cout&&a.value()&&std::
std::cout&&b.value()&&std::
return c.exec();
}
转载请保留出处:/mobile_development_question/017.html
本周热门问答排行

我要回帖

更多关于 请教一个问题 日语 的文章

 

随机推荐