【问题标题】:error C2280: 'QQmlPrivate::QQmlElement<T>::QQmlElement(void)': attempting to reference a deleted function错误 C2280:“QQmlPrivate::QQmlElement<T>::QQmlElement(void)”:试图引用已删除的函数
【发布时间】:2020-08-21 11:38:35
【问题描述】:

我尝试在Qt\Examples\Qt-5.9\quick\views 中操作qt 项目的一部分,我是qml 的新手,并且我尝试每次打开不同的QDialog 窗口,具体取决于已单击的qml pathview 组件.首先,我开始创建一个class (interfacageQML),它将用于连接qml Mainform 和QDialog (qtinterface),其中包括了必要的文件interfacageqml.h

这里是 main.cpp:

#include "interfacageqml.h"                                               

int main(int argc, char *argv[]) 
{                                                             
    QGuiApplication app(argc, argv);             
    qmlRegisterType<interfacageQML>("Interfacage", 1, 0,"Component:MouseArea");

   QQmlApplicationEngine engine;
   engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

   return app.exec();                                                          
}

这里是interfacageqml.h:

#ifndef INTERFACAGEQML_H
#define INTERFACAGEQML_H

#include <QObject>
#include "qtinterface.h"

class interfacageQML : public QObject
{
Q_OBJECT

public:
interfacageQML(QObject *parent);
~interfacageQML();


Q_INVOKABLE void mouseClick();

signals:
    void clicked();

};

#endif // INTERFACAGEQML_H

interfacageqml.cpp:

#include "interfacageqml.h"
#include <QDebug>
#include <QApplication>

interfacageQML::interfacageQML(QObject *parent)
    : QObject(parent)
{

}

interfacageQML::~interfacageQML()
{

}

void interfacageQML::mouseClick()
{
    qDebug() << "qmlinterface::mouseClick()";
    emit clicked();
}

我的项目是这样组织的:

qmlinterface.qrc 文件包含以下路径:

ma​​in.qml:

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    MainForm{
        anchors.fill: parent
    }
}

MainForm.qml:

import QtQuick 2.6
import QtQuick.Controls 2.0 as QQC2
import Interfacage 1.0


Rectangle {
    width: 800
    height: 800
    color: "white"

    ListModel {
        id: appModel
        ListElement {
            name: "Contacts"
            icon: "pics/Resources/AddressBook_48.png"
        }
        ListElement {
            name: "Music"
            icon: "pics/Resources/AudioPlayer_48.png"
        }
        ListElement {
            name: "Movies"
            icon: "pics/Resources/VideoPlayer_48.png"
        }
        ListElement {
            name: "Camera"
            icon: "pics/Resources/Camera_48.png"
        }
        ListElement {
            name: "Calendar"
            icon: "pics/Resources/DateBook_48.png"
        }
        ListElement {
            name: "Todo List"
            icon: "pics/Resources/TodoList_48.png"
        }
    }

    Component {
        id: appDelegate
        Item {
            width: 100
            height: 100
            scale: PathView.iconScale

            Image {
                id: myIcon
                y: 20
                anchors.horizontalCenter: parent.horizontalCenter
                source: icon
            }
            Text {
                anchors {
                    top: myIcon.bottom
                    horizontalCenter: parent.horizontalCenter
                }
                text: name
            }

            MouseArea {
                anchors.fill: parent
                onClicked: {
                    view.currentIndex = index
                    Interfacage.mouseClick
                }
            }
        }
    }

    Component {
        id: appHighlight
        Rectangle {
            width: 100
            height: 80
            color: "lightsteelblue"
        }
    }

    PathView {
        id: view
        anchors.fill: parent
        highlight: appHighlight
        preferredHighlightBegin: 0.5
        preferredHighlightEnd: 0.5
        focus: true
        model: appModel
        delegate: appDelegate
        path: Path {
            startX: 50
            startY: 80
            PathAttribute {
                name: "iconScale"
                value: 2.0
            }
            PathQuad {
                x: 250
                y: 200
                controlX: 50
                controlY: 200
            }
            PathAttribute {
                name: "iconScale"
                value: 2.0
            }
            PathQuad {
                x: 600
                y: 50
                controlX: 400
                controlY: 200
            }
            PathAttribute {
                name: "iconScale"
                value: 2.0
            }
        }
    }
}

当我运行这个项目时,我得到了一个error

错误:C2280

但是,当我评论这一行时:qmlRegisterType&lt;interfacageQML&gt;("Interfacage", 1, 0, "Component:MouseArea"); 项目运行,我可以在 MainForm 中的路径视图组件之间导航。

【问题讨论】:

  • 为什么删除了之前的问题?刚想回答,就被删了。没关系。我的回答几乎和 Eyllanescs 一样。可能不那么广泛。
  • 我觉得我有一个错误,问题是每次我修改qml文件我都需要打开qmlinterface.qrc并点击保存按钮。

标签: qt qml qtquick2 qt-quick qtquickcontrols


【解决方案1】:

当您使用 qmlRegisterType 在 QML 中注册一个新的数据类型时,它不是一个对象,在这种情况下,名称“Component: MouseArea”是不合适的。

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

另一个错误是默认情况下您必须传递父级,在本例中为 0 或 nullptr,因为项目可能没有父级。

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

正如我在第一行所说的,这是一个新类型,它不是一个对象,所以你必须创建它。

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

最后如果要使用它必须通过item调用函数。

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

由于您想通过该类将您的QDialogQML 连接起来,因此您不能这样做,因为它们将是不同的对象,一种解决方案是使用单例,为此您必须执行以下操作:

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();
}

ma​​in.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();
}

因为是单例所以不需要创建item,直接创建即可:

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

最后一个例子可以在下面的link找到。

【讨论】:

  • 有,现在qml界面打开了
  • @Khaled 如果成功了,别忘了将我的答案标记为正确,如果你不知道怎么做,请查看以下链接:tour
  • 但是,当我单击一个项目时,我看不到 qDebug 消息。
  • 好奇怪,点名字吧。
  • 可能是Visual Studio没有开启打印模式,我在QtCreator中执行正确,直接用你的QDialog试试或者通过QtCreator执行。
猜你喜欢
  • 2021-11-13
  • 2014-02-19
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
相关资源
最近更新 更多