C++ ';QObject';是';记录器';
我正在尝试在新创建的类中使用QTimer,它继承了QObject。然而,我尝试它,我不断得到的错误'QObject'是一个模糊的基础'Recorder'。在我的简单程序中,我确实尽了最大努力避免歧义,但还是被它卡住了。 这是我的课程结构C++ ';QObject';是';记录器';,c++,qt,qthread,qtcore,qobject,C++,Qt,Qthread,Qtcore,Qobject,我正在尝试在新创建的类中使用QTimer,它继承了QObject。然而,我尝试它,我不断得到的错误'QObject'是一个模糊的基础'Recorder'。在我的简单程序中,我确实尽了最大努力避免歧义,但还是被它卡住了。 这是我的课程结构 #include "dialog.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog w;
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
结果如下:
任何帮助都将不胜感激。QThread已经继承了QObject,您不能同时继承QObject本身的两个类。您的代码中有几个问题: 1) 错误使用Qt线程
class Recorder : public QThread, public QObject
a) 因为QThread继承QObject,所以在不显式继承QObject的情况下继承QThread就足够了
b) 即使您这样做了,从历史上看,QObject
在一般情况下应该是列表中的第一个基础
c) 但是,您可能希望重新考虑如何使用线程。这是一种方法,但必然是最好的
2) 为堆上的QTimer
分配对象
首先,为什么要在堆上为计时器分配内存?在堆栈上分配它是可以的,特别是因为它是一个成员。这样,您也就不需要处理这个
麻烦了。整个内存管理变得简单多了
3) 不使用Q_NULLPTR
对于父对象的默认值,应该使用它而不是0
4) 包括整个QtCore模块
#include <QtCore>
当然,如果您在Qt中以相反的方式使用线程机制,那么为继承编写以下代码是完全正确的:
class Recorder : public QObject
但是,您的代码将需要一些其他更改,因此,无论是哪种方式,代码都会像现在这样被破坏。您不应两次继承QObject。这是因为信号和插槽是由整数映射的,ID可能会相互冲突 这也适用于从QObject继承的任何对象
class BadClass : public QTimer, public Dialog
{
};
QThread
已经是QObject
,不需要继承它两次。@vahancho我确实考虑过这一点,但当我不包括公共QObject时,我得到的错误与“operator=”不匹配(操作数类型为“QTimer”和“QTimer*”)*timer=new QTimer(这一错误)^我最终也会在构造函数中省去*,因为计时器已经是指针了。虽然这不能解决问题,但它仍然是错误的。顺便说一下,请提供文本格式的错误,不要添加图像作为信息。图像链接很快就会失效,所以请更新您的问题。@isADon,因为您应该编写theTimer=newqtimer(这个)代码>取而代之。删除*。感谢您提供详细的答案。我应该如何在构造函数中初始化我的QTimer?@isADon:鉴于您以前使用过的构造函数参数,没有必要初始化它。这是为您自动完成的。只要开始使用它。当然,您需要将它用作计时器。
而不是计时器->。如果您不建议从QThread继承,我会+1。阅读@Bцћ:你的知识已经过时了(~1.5岁)。更新它:在不同的场景中,这两种方式都很好,最近的一位核心Qt开发人员说,他不是很多年前写过东西,甚至不再在Qt上工作的人@FinalContest感谢这个解决方案让我编译它没有任何错误。但是,当我将计时器连接到我的专用插槽setFalse()时,如下所示:连接(&theTimer,SIGNAL(timeout()),this,slot(setFalse());我得到一个错误QObject::connect:没有这样的插槽QThread::setFalse(),这是有意义的,因为我的setFalse在Recorder::setFalse()中,而不是在QThread中?为什么它从qThread调用它?
*theTimer = new QTimer(this);
class Recorder : public QThread, public QObject
#include <QtCore>
class Recorder : public QThread
{
public:
Recorder();
void run();
private:
QTimer theTimer;
class Recorder : public QObject
class BadClass : public QTimer, public Dialog
{
};