我认为我们使用的是非常旧的 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
的类,您必须同时继承 QObject
和 QThread
:
#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/