Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ';QObject';是';记录器';_C++_Qt_Qthread_Qtcore_Qobject - Fatal编程技术网

C++ ';QObject';是';记录器';

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;

我正在尝试在新创建的类中使用QTimer,它继承了QObject。然而,我尝试它,我不断得到的错误'QObject'是一个模糊的基础'Recorder'。在我的简单程序中,我确实尽了最大努力避免歧义,但还是被它卡住了。 这是我的课程结构

#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
{
};