error C2280: 'QQmlPrivate::QQmlElement::QQmlElement(void)': attempting to reference a deleted function

后端 未结 1 486
粉色の甜心
粉色の甜心 2021-01-14 19:55

I tried to operate a part of a qt project in Qt\\Examples\\Qt-5.9\\quick\\views, I am new to qml and I am trying to open each time a different

相关标签:
1条回答
  • 2021-01-14 20:27

    When you use qmlRegisterType you are registering a new data type in QML, it is not an object, in that case the name "Component: MouseArea" is not suitable.

    qmlRegisterType<interfacageQML>("Interfacage", 1, 0, "InterfacageQML");
    

    Another error is that you must pass a parent by default, in this case 0 or nullptr since the items may not have parents.

    class interfacageQML : public QObject
    {
        Q_OBJECT
    public:
        explicit interfacageQML(QObject *parent = nullptr);
        [...]
    

    As I said in the first lines, this is a new type, it is not an object so you must create it.

    import QtQuick 2.6
    import QtQuick.Controls 2.0 as QQC2
    import Interfacage 1.0
    
    Rectangle {
        width: 800
        height: 800
        color: "white"
    
        InterfacageQML{
            id: myitem
        }
        [...]
    

    And in the end if you want to use it you must call the function through the item.

    MouseArea {
        anchors.fill: parent
        onClicked: {
            view.currentIndex = index
            myitem.mouseClick()
        }
    }
    

    Since you want to connect your QDialog with the QML through that class, you can not do it since they will be different objects, one solution for this is to use a singleton, for this you must do the following:

    interfacageqml.h

    #ifndef INTERFACAGEQML_H
    #define INTERFACAGEQML_H
    
    #include <QObject>
    #include <QQmlEngine>    
    
    class interfacageQML : public QObject
    {
        Q_OBJECT
        static interfacageQML* instance;
        explicit interfacageQML(QObject *parent = nullptr);
    public:
        static interfacageQML *getInstance();
        ~interfacageQML();
        Q_INVOKABLE void mouseClick();
    
    signals:
        void clicked();
    };
    #endif // INTERFACAGEQML_H
    

    interfacageqml.cpp

    #include "interfacageqml.h"
    #include <QDebug>
    
    interfacageQML* interfacageQML::instance = 0;
    
    interfacageQML *interfacageQML::getInstance()
    {
        if (instance == 0)
            instance = new interfacageQML;
        return instance;
    }
    
    interfacageQML::interfacageQML(QObject *parent) : QObject(parent)
    {
    }
    
    interfacageQML::~interfacageQML()
    {
    }
    
    void interfacageQML::mouseClick()
    {
        qDebug() << "qmlinterface::mouseClick()";
        emit clicked();
    }
    

    main.cpp

    #include "interfacageqml.h"
    
    #include <QGuiApplication>
    #include <QQmlApplicationEngine>
    
    static QObject *singletonTypeProvider(QQmlEngine *, QJSEngine *)
    {
    
        return interfacageQML::getInstance();
    }
    
    
    int main(int argc, char *argv[])
    {
        qmlRegisterSingletonType<interfacageQML>("Interfacage", 1, 0, "InterfacageQML", singletonTypeProvider);
    
        // test
        interfacageQML *obj = qobject_cast<interfacageQML*>(interfacageQML::getInstance());
        QObject::connect(obj, &interfacageQML::clicked,[]{
            qDebug()<<"clicked";
        });
    
        QQmlApplicationEngine engine;
        engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
        if (engine.rootObjects().isEmpty())
            return -1;
    
        return app.exec();
    }
    

    As it is a singleton it is not necessary to create an item, you can do it directly:

    import Interfacage 1.0
    [...]
    MouseArea {
        anchors.fill: parent
        onClicked: {
            view.currentIndex = index
            InterfacageQML.mouseClick()
        }
    }
    

    This last example can be found in the following link.

    0 讨论(0)
提交回复
热议问题