'QObject'是一个模棱两可的'Recorder'基础
'QObject' is an ambiguous base of 'Recorder'
我试图使用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
{
};
- G锁定铸造到基础上会释放模拟行为
- 在C++中如何在没有pow的情况下进行基础计算
- 我可以把基础班提升为儿童班吗
- "Inverse SFINAE"避免模棱两可的过载
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 操作员C++的模棱两可的过载
- 模棱两可的重载模板
- 将作用域枚举转换为基础类型
- 调用重载的"<大括号括起来的初始值设定项列表>"对于对来说就足够了是模棱两可的
- 为什么static_cast基础类型的枚举类int8_t获得意外值?
- 使用范围 v3 操作基础范围
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 模棱两可的 != reverse_iterator运算符
- SFINAE不能防止模棱两可的操作员过载吗?
- VSCode 说 std::chrono 是模棱两可的,如果运算符<<重载
- 为什么对模板的调用不模棱两可?
- 与C++哈希表的基础知识混淆
- 修复重载运算符的使用'+'模棱两可?
- 运算符<< 是模棱两可的打印枚举值,基础类型为 short
- 'QObject'是一个模棱两可的'Recorder'基础