c++ - 链接基于 Qt 的应用程序时出错

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

我认为我们使用的是非常旧的 Qt 版本 1.1。大约 2000 年。它仅供内部使用,因此目前无需担心升级。程序是使用 Visual Studio 2005 在 Windows 上构建的。除了过去几天我一直在研究的内容外,我对 Qt 知之甚少。

(非常基本的)架构是:

  • main() 创建一个 QApplication 实例。
  • main() 还创建一个指向 QWidget 自定义子类的指针,称为 Wizard。
  • Wizard 创建了一些 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 来生成包含在项目中的输出文件。我确实尝试在包含上述类的 header 上运行 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
...

最佳答案

对于 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 代码。

关于c++ - 链接基于 Qt 的应用程序时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25312477/

相关文章:

c++ - 如何引发C++异常

c++ - googlemock 框架不适用于虚拟继承

python - 在 Django 应用程序中启动线程时出现奇怪的错误

java - 等待/通知死锁

Java IO vs NIO vs 任务队列

c++ - 如何使用 ms code gen 添加/bigobj 切换到 clang?

visual-studio - 在授权 header visual studio 2013 负载测试中向变量添加文本

c++ - 为什么编译器选择下面的模板版本?

c++ - 创建对象数组的问题 C++

visual-studio - Visual Studio 2019 16.5+ 中的旧版 C# 和 VB 表达式评估器