我认为我们正在使用Qt,1.1的旧版本。大约2000年。它只供内部使用,所以此时升级几乎没有什么问题。程序是在Windows上使用Visual Studio 2005构建的。除了过去几天我一直在研究的内容之外,我对Qt知之甚少。
(非常基础)架构是:
我正在尝试实现从main()启动的新类/线程,其目的是监视服务并发出要在Controller对象/线程中执行的操作。
我的新课程/主题定义:
#include "qthread.h"
class ServiceMonitor : public QThread
{
Q_OBJECT
public:
ServiceMonitor(int p) : port(p) {}
~ServiceMonitor() {};
private:
void run();
void TerminateProgram();
signals:
void SomethingBadHappened();
private:
int port;
};
在我的cpp文件中:
void ServiceMonitor::TerminateProgram()
{
...
emit SomethingBadHappened();
...
}
编译应用程序时,收到链接器错误:
error LNK2019: unresolved external symbol "protected: void __thiscall ServiceMonitor::SomethingBadHappened(void)"
(?SomethingBadHappened@ServiceMonitor@@IAEXXZ) referenced in function "private: void __thiscall ServiceMonitor::TerminateProgram(void)"
(?TerminateProgram@ServiceMonitor@@AAEXXZ) ServiceMonitor.obj
我注意到我们所有其他对象(有信号)都不是从Qthread派生的,所以我没有可以遵循的例子。其余的(使用信号)来自QWidget或QObject)。我注意到那些在自定义编译步骤中使用moc.exe来生成包含在项目中的输出文件。我确实尝试在包含上面类的头文件上运行moc并包括输出文件,我收到了:
Error 1 error C2039: 'className' : is not a member of 'QThread'
Error 2 error C3861: 'badSuperclassWarning': identifier not found
Error 3 error C2039: 'staticMetaObject' : is not a member of 'QThread'
Error 4 error C3861: 'activate_signal': identifier not found
我做错了什么?
修改
试过RA的提议,做了一个款待(一旦我记得包括qobject.h)。谢谢!
新定义:
#include "qthread.h"
#include "qobject.h"
class ServiceMonitor : public QObject, public QThread
...
答案 0 :(得分:2)
对于Qt 4.0之前的Qt版本,QThread
类未从QObject
继承。因此,如果要创建一个派生自QThread
的信号的类,则必须同时继承QObject
和QThread
:
#include "qobject.h"
#include "qthread.h"
class ServiceMonitor : public QObject, public QThread
{
Q_OBJECT
// Rest of class
};
请注意,QObject
必须列为派生自。
还记得在类上运行moc
并编译生成的moc代码。
答案 1 :(得分:0)
缺少的部分是所有信号的实现,以及staticMetaObject
结构声明为Q_OBJECT
宏的一部分。那些是由moc生成的。标头的调整通常由Visual Studio的Qt加载项处理。不幸的是,VS 2005没有Qt-5加载项。
您的选择是按照降低需求的顺序。
使用qmake生成一个VS 2005项目文件,为您调用moc,并包含必要的文件。这将是您使用Qt的最佳方式。
在包含moc
宏的所有头文件上手动运行Q_OBJECT
,并将生成的代码添加到项目中。
升级至至少VS 2008(非Express),以便您可以使用Qt 5加载项。
尝试使用Qt 4,它有一个VS 2005的加载项。
由于您可以同时安装多个版本的Qt,因此您可以并行采用多种方法。例如,#1和#4。