链接基于Qt的应用程序出错

时间:2014-08-14 15:57:17

标签: c++ multithreading visual-studio qt qt-signals

我认为我们正在使用Qt,1.1的旧版本。大约2000年。它只供内部使用,所以此时升级几乎没有什么问题。程序是在Windows上使用Visual Studio 2005构建的。除了过去几天我一直在研究的内容之外,我对Qt知之甚少。

(非常基础)架构是:

  • main()创建一个QApplication实例。
  • main()还创建一个指向QWidget的自定义子类的指针,称为向导。
  • 向导创建了许多Controller对象,这些对象是从QThread创建的子类。

我正在尝试实现从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
...

2 个答案:

答案 0 :(得分:2)

对于Qt 4.0之前的Qt版本,QThread类未从QObject继承。因此,如果要创建一个派生自QThread的信号的类,则必须同时继承QObjectQThread

#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加载项。

您的选择是按照降低需求的顺序。

  1. 使用qmake生成一个VS 2005项目文件,为您调用moc,并包含必要的文件。这将是您使用Qt的最佳方式。

  2. 在包含moc宏的所有头文件上手动运行Q_OBJECT,并将生成的代码添加到项目中。

  3. 升级至至少VS 2008(非Express),以便您可以使用Qt 5加载项。

  4. 尝试使用Qt 4,它有一个VS 2005的加载项。

  5. 由于您可以同时安装多个版本的Qt,因此您可以并行采用多种方法。例如,#1和#4。