当前位置: 代码迷 >> QT开发 >> 本人刚学Qt,在信号与槽部分遇到有关问题,求大神解答
  详细解决方案

本人刚学Qt,在信号与槽部分遇到有关问题,求大神解答

热度:53   发布时间:2016-04-25 03:38:50.0
本人刚学Qt,在信号与槽部分遇到问题,求大神解答
#include <QtCore/QCoreApplication>
#include <iostream>
using namespace std;
class Foo:public QObject
{
Q_OBJECT
public:
Foo();
int value() const
{
return val;
}
public slots:
void setValue(int);
signals:
void valueChange(int);
private:
int val;
};

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 个无法解析的外部命令

------解决方案--------------------
引用:
Quote: 引用:

把申明和实现分开到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”: 不在形参表中
  相关解决方案