'QObject'是一个模棱两可的'Recorder'基础

'QObject' is an ambiguous base of 'Recorder'

本文关键字:模棱两可 基础 一个 Recorder QObject      更新时间:2023-10-16

我试图使用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();
}

dialog.h: mainwindow UI

#ifndef DIALOG_H
#define DIALOG_H
#include "detector.h"
#include <QDialog>
#include <QtCore>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
    Q_OBJECT
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
private:
    Ui::Dialog *ui;
    Detector myDetector;

detector.h:检测器窗口UI

#ifndef DETECTOR_H
#define DETECTOR_H
#include <QDialog>
#include <QtCore>
#include <QObject>
#include "actualrec.h"
namespace Ui {
class Detector;
}
class Detector : public QDialog
{
    Q_OBJECT
public:
    explicit Detector(QWidget *parent = 0);
    ~Detector();
    void run();
private:
    ActualRec theDetector;
    Ui::Detector *ui;

actualrech .h:检测器代码

#ifndef ACTUALREC_H
#define ACTUALREC_H
#include <QtCore>
#include <QObject>    
#include <QImage>
#include "recorder.h"
class ActualRec : public QThread
{
public:
    ActualRec();
    void run();
private:        
    Recorder theRecorder;

recorder.h:记录器代码,我想使用我的QTimer

#ifndef RECORDER_H
#define RECORDER_H
#include <QtCore>
class Recorder : public QThread, public QObject
{
public:
    Recorder();
    void run();
private:
    QTimer* theTimer;

recorder.cpp构造函数

 *theTimer = new QTimer(this);

输出如下:https://i.stack.imgur.com/CTNCV.png

如有任何帮助,不胜感激

你的代码中有几个问题:

1) Qt线程使用错误

class Recorder : public QThread, public QObject
a)继承QThread而不显式继承QObject就足够了,因为QThread继承了QObject。

b)即使你这样做了,历史上,在一般情况下,QObject应该是列表中的第一个碱基。

c)但是,您可能希望重新考虑如何使用线程。这是一种方法,但必然是最好的。

2) 在堆上为QTimer分配对象

为什么要在堆上为计时器分配内存?在堆栈上分配它是可以的,特别是因为它是一个成员。这样,您就不需要处理this的麻烦。整个内存管理变得简单多了。

3) 不使用Q_NULLPTR

你应该使用它而不是0作为父节点的默认值。

4) 包括整个QtCore模块

#include <QtCore>

您应该只包括您最终使用的部分。这是一种蛮力方式。

因此,写成这样:

class Recorder : public QThread
{
public:
    Recorder();
    void run();
private:
    QTimer theTimer;

当然,如果您在Qt中以另一种方式使用线程机制,那么为继承编写这样的代码是完全可以的:

class Recorder : public QObject

但是你的代码需要一些其他的改变,所以代码就像现在一样被破坏了。

QThread已经继承了QObject,你不能同时继承两个同时继承QObject的类

不能继承QObject两次。这是因为信号和槽是由整数映射的,并且id可以相互冲突。

这也适用于从QObject继承的任何对象。

class BadClass : public QTimer, public Dialog
{
};