[英]Why is this not a default constructor in "Call to implicitly-deleted default constructor of 'QQmlElement'
我正在嘗試在 Qml 引擎中注冊 JB_NodeModel。 我收到此錯誤:
“調用 QQmlElement(JB_NodeModel) 的隱式刪除默認構造函數 - QQmlElement(JB_NodeModel) 的默認構造函數被隱式刪除,因為基礎 class 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, 0, "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); }
您正在明確定義您的構造函數。 如果不向構造函數傳遞任何參數怎么辦? 應該使用哪個構造函數? QAbstractItemModel提供單個QObject*
參數的參數,還是您使用兩個 arguments 定義的參數? 您不能在沒有任何 arguments 的情況下實例化JB_NodeModel
,因為您的編譯器無法確定哪個構造函數是默認構造函數。 換句話說,調用new JB_NodeModel()
將是模棱兩可的,因此您的 class 將沒有默認構造函數。
嘗試將aJobID
非默認值,看看它是否有效。 如果您必須默認 jobID=3,您也可以像這樣創建構造函數:
explicit JB_NodeModel:JB_NodeModel(QObject *parent = nullptr):
QAbstractItemModel(parent),
jobID(3)
...
{
...
}
關於它的一個非常奇怪的事情是你是如何成功編譯這段代碼的? 我假設您正在修剪代碼以將其包含在此處,但為了讓未來的讀者清楚:
QAbstractItemModel是一個抽象的 class ,您至少必須實現它的純虛函數。 根據關於子類化 QAbstractItemModel的 Qt 文檔:
在繼承 QAbstractItemModel 時,至少必須實現 index()、parent()、rowCount()、columnCount() 和 data()。 這些功能用於所有只讀模型,並構成可編輯模型的基礎。
解決了這個問題。 原來默認構造函數很好。 只是為了嘗試一下,我嘗試在堆棧上創建 JB_Node 並得到一個錯誤,說構造函數中有 int jobid(我已經取出)。 原來 my.pro 文件已損壞,並且該項目正在使用來自完全不同位置的 JB_NodeModel 文件(而不是在 Qt Creator 中打開的文件) - 不知道這是怎么發生的,但是一旦我修復了項目,一切都是很好,並且在 QML 引擎中注冊的 class 正常。 現在我無法讓 model 數據顯示在 TreeView 中,所以如果我無法解決,我會發布它。 感謝那些回答的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.