簡體   English   中英

為什么這不是“調用'QQmlElement'的隱式刪除默認構造函數中的默認構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM