我正在尝试在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); }