我有一个相对简单的类,其中包含一些显示为卡片的小部件(label,lineEdits,pushButtons)的布局。一切正常,直到我尝试添加信号和插槽。下面的头文件可以很好地编译,如图所示。
#include <QString>
#include <QObject>
#include <QWidget>
class KMLFile //: public QObject
{
//Q_OBJECT
public:
KMLFile();
~KMLFile();
QString m_originalFilename;
QString m_originalPath;
QString m_proposedFilename;
QString m_propsoedPath;
QString m_coords;
QWidget* trackWidget;
void populate(QString originalFilename, QString originalPath, QString proposedFilename, QString coords);
QString getCoords();
int getLength();
//public slots:
//void changeFilename();
};
当保留这些代码时,我收到以下错误:
“C:... \ qlist.h:425:错误:C2280:'KMLFile :: KMLFile(const KMLFile&amp;)': 试图引用已删除的功能
我正在使用Qt5.3和Qt Creator。我尝试过清理,运行qmake并删除build文件夹无济于事。我很难过!
感谢任何有关如何解决这个问题的见解,以便我能够进步。
答案 0 :(得分:2)
QObject
的复制构造函数是私有的 - 或已删除。
代码中的其他地方使用KMLFile
的复制构造函数,然后调用QObject
的复制构造函数。
您可以重新实现KMLFile
的复制构造函数,但最好的解决方案是根本不使用它。
在QList
中,您应该存储指向KMLFile
对象的指针而不是对象本身,前提是它们的存活时间比列表本身长。或者您可以开始使用QSharedPointer
。
答案 1 :(得分:1)
QObject有一个已删除的复制构造函数。您的类正在创建编译器生成的复制构造函数。当您使QObject
成为类的基础时,编译器为KLMFile
生成的复制构造函数会尝试调用基类的已删除复制构造函数,即出现错误时。
如果需要,将自动生成KLMFile
的复制构造函数(即,如果您尝试复制该类的实例),除非您明确指定了自己的复制构造函数。
如果错误中引用的行靠近KLMFile
类的副本,那么这将是一个强烈的指示。