为什么这不是“调用隐式删除的'QQmlElement'的默认构造函数”中的默认构造函数

我正在尝试在Qml引擎中注册JB_NodeModel。 我收到此错误:

“对隐式删除的qqmlElement(JB_NodeModel)的默认构造函数的调用-隐式删除了qqmlElement(JB_NodeModel)的默认构造函数,因为基类JB_NodeModel没有默认构造函数。”

但是我看不到默认构造函数有问题。 任何帮助将不胜感激。

我使用了初始化程序列表,但似乎无济于事。

这是JB_NodeModel.h的简化版本:

class SP3CORESHARED_EXPORT JB_NodeModel : public QAbstractItemModel
{
    Q_OBJECT
public:
 explicit JB_NodeModel(QObject *parent = nullptr);

~JB_NodeModel();

protected:
    JB_Node* rootNode;
    JB_Node* actingRootNode;
    bool isValidURL(QString fieldName,JB_Node* node) const;

    QVector<QString> columnHeadingsV;    
    QHash<int,QVector<QString>> mapped_dbFieldNamesH;    
    QList<QString> unEditableDBFieldNamesList;
    QList<QString> editableCheckBoxDBFieldNamesList; 

private:
    JB_DatabaseManager& mDB;
    int jobID;
    int numOfLevels;
    QSharedPointer<JB_NodeModelHelpProt> nodeModelHelper;
    QVector<QSharedPointer<QHash<QString,JB_Node*>>> nodesHV;     
    QVector<JB_Node*> alteredNodesV;
    bool isTreeModel;
    bool canEmitDataChanged;

 };

这是JB_NodeModel.cpp构造函数的来源:

JB_NodeModel::JB_NodeModel(QObject *parent)
: QAbstractItemModel(parent),rootNode(nullptr),actingRootNode(nullptr),mDB(JB_DatabaseManager::instance()),jobID(aJobID),numOfLevels(1),nodeModelHelper(nullptr),isTreeModel(true),canEmitDataChanged(true),dragDropHelper(false)
{
    QSharedPointer<JB_NodeModelHelpProt> aNodeModelHelper(new JB_NodeModHelp_TreeGrpPers());
    nodeModelHelper = aNodeModelHelper;

    canEmitDataChanged = true;
    dragDropHelper = false;

    Q_ASSERT(!nodeModelHelper.isnull());

    alteredNodesV.clear();

    rootNode = nullptr;
    actingRootNode = nullptr;

这是在QML引擎中注册:

QGuiApplication app(argc,argv);

qmlRegisterType<JB_NodeModel>("JB_NodeModel",1,"JB_NodeModel");


qqmlApplicationEngine engine;

const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine,&qqmlApplicationEngine::objectCreated,&app,[url](QObject *obj,const QUrl &objUrl) {
    if (!obj && url == objUrl)
        QCoreApplication::exit(-1);
},Qt::QueuedConnection);
engine.load(url);

这是qqmlprivate.h有关qqmlElement的相关部分:

class QJSEngine;
class qqmlEngine;
class qqmlCustomParser;
namespace qqmlPrivate
{
    void Q_QML_EXPORT qdeclarativeelement_destructor(QObject *);
    template<typename T>
    class qqmlElement final : public T
{
public:
    ~qqmlElement() override {
        qqmlPrivate::qdeclarativeelement_destructor(this);
    }
    static void operator delete(void *ptr) {
        // We allocate memory from this class in qqmlType::create
        // along with some additional memory.
        // So we override the operator delete in order to avoid the
        // sized operator delete to be called with a different size than
        // the size that was allocated.
        ::operator delete (ptr);
    }
    static void operator delete(void *,void *) {
        // Deliberately empty placement delete operator.
        // Silences MSVC warning C4291: no matching operator delete found
    }
};


template<typename T>

//错误发生在下一行

void createInto(void *memory) { new (memory) qqmlElement<T>; }

template<typename T>
QObject *createParent(QObject *p) { return new T(p); }
wydly443 回答:为什么这不是“调用隐式删除的'QQmlElement'的默认构造函数”中的默认构造函数

您正在显式定义构造函数。如果不将任何参数传递给构造函数该怎么办?应该使用哪个构造函数? QAbstractItemModel提供的一个带有单个QObject*参数,或者您定义的两个参数?您不能在没有任何参数的情况下实例化JB_NodeModel,因为编译器无法确定哪个构造函数为默认构造函数。换句话说,调用new JB_NodeModel()模糊,因此您的类将没有默认的构造函数。

尝试将aJobID设置为非默认值,然后查看它是否有效。如果必须默认jobID = 3,也可以像这样创建构造函数:

explicit JB_NodeModel:JB_NodeModel(QObject *parent = nullptr):
QAbstractItemModel(parent),jobID(3)
... 
{
 ...
}

一个非常奇怪的事情是您如何成功地编译此代码?我假设您正在修剪代码以将其包含在此处,但要让以后的读者清楚了解:

QAbstractItemModel是一个抽象类,您至少必须实现它的纯虚函数。根据Qt文档about subclassing QAbstractItemModel

  

子类化QAbstractItemModel时,至少必须   实现index(),parent(),rowCount(),columnCount()和data()。   这些功能在所有只读模型中都使用,并且构成了基础   的可编辑模型。

,

解决了问题。原来默认的构造函数很好。只是尝试一下,我试图在堆栈上创建JB_Node并收到一条错误消息,指出构造函数在其中包含int jobid(我已取出)。原来我的.pro文件已损坏,并且该项目正在从完全不同的位置(而不是在Qt Creator中打开的位置)使用JB_NodeModel文件-不确定如何发生,但是一旦我修复了该项目,所有很好,并且在QML Engine中注册的类还可以。现在,我无法将模型数据显示在TreeView中,因此,如果无法解决问题,我将其发布。感谢那些回答。

本文链接:https://www.f2er.com/3162500.html

大家都在问