2

我有一个叫做网格的类。我想跟踪它的对象。所以当一个新的网格被创建时,我想要一个信号。我已经添加了

class mesh: public QObject

并将所有方法设为槽并向 c-tor meshCreated 添加一个信号。但从这里开始,我多年的痛苦开始了。无论如何,标题中的错误开始出现。即使我评论了所有行,即//在代码中的每一行之前添加,它仍然说相同。我怎样才能解决这个问题?

实际代码

#ifndef mesh_H
#define mesh_H

#include <QObject>
#include "mvert.h"
#include "medge.h"
#include "mface.h"

#include <QList>
#include <QString>
#include <QDebug>
#include "glmaterial.h"

class mesh : public QObject
{
    Q_OBJECT
public:
    explicit mesh(QObject *parent = 0);
    QString getName();

private:
    QString Name;
    GLMaterial material;

    QList<MVert> VertList;
    QList<MEdge> EdgeList;
    QList<MFace> FaceList;

    MVert Centroid;

    QList<int> QFaces;
    QList<int> TFaces;

public slots:
    void setName(QString Name);
    void ReadmeshData(QString meshsrc);
    void displayVerts();
    void displayEdges();
    void displayFaces();
    void addVert(MVert vert);
    void addEdge(MEdge edge);
    void addFace(MFace face);
    void removeDoubles();
    MVert generateCentroid();
    //FIXUS
    void sortQandT();
    void reorderFaces();
    void subDivFace(int index, int res);
    void forcedTriangulate();
    //FIXUS
    bool isVertInEdge(MVert input, MEdge edg);
    bool similarVerts(int i,int j);

    QList<int> relatedFacesToVert(MVert input);
    QList<int> relatedEdgesToVert(MVert input);
    QList<int> relatedVertsToVert(MVert input);
    QList<int> relatedFacesToEdge(MEdge input);
    QList<int> relatedEdgesToEdge(MEdge input);
    QList<int> relatedEdgesToFace(MFace input);
    QList<int> relatedFacesToFace(MFace input);

    QList<MVert> reducedVList();

    QList<MVert> vlistInstance();

    MVert midPointOfEdge(int i);
    MVert centroidOfFace(int i);

    mesh operator=(mesh input);

    void GLdraw();

signals:
    void meshCreated(mesh *mesh);

};
4

1 回答 1

2

产生此错误的行是这一行:

mesh operator=(mesh input);

派生的类QObject不允许有复制构造函数。正如QObject文档所述:

没有复制构造函数或赋值运算符 QObject 既没有复制构造函数也没有赋值运算符。这是设计使然。实际上,它们是被声明的,但是在一个带有宏 Q_DISABLE_COPY() 的私有部分中。事实上,所有从 QObject 派生的 Qt 类(直接或间接)都使用这个宏来声明它们的复制构造函数和赋值运算符是私有的。推理可以在 Qt 对象模型页面上关于 Identity vs Value 的讨论中找到。主要结果是您应该使用指向 QObject(或指向您的 QObject 子类)的指针,否则您可能会试图将 QObject 子类用作值。例如,如果没有复制构造函数,就不能使用 QObject 的子类作为要存储在容器类之一中的值。您必须存储指针。

如果您想跟踪创建的mesh对象,您可以使用例如QList<mesh*>来自其他类之一的对象。创建对象后,您将其推送到列表等。

于 2012-02-11T11:47:48.630 回答