无法在 qml 中创建C++类对象"Cannot assign object to list property "数据" "

Can't create C++ class object in qml "Cannot assign object to list property "data""

本文关键字:assign Cannot object list 数据 property to 对象 qml 创建 C++      更新时间:2023-10-16

我有一个痛苦的问题,我为此浪费了很多时间。我需要帮助,因为我还不知道。

就在这里。我正在Windows8.1的QtCreator中使用qml编写qt快速应用程序。创建了我自己的C++类,名为";一";。通过注册

qmlRegisterType<One>("OneClass", 1, 0, "One");

在qml文件中,我导入了它:

import OneClass 1.0

现在一切都很顺利。但后来我决定创建共享库,在那里我把我的";一个";C++类。已将单独的项目创建为新项目->库->C++库。以";mainlib";,一切都很好。通过在.pro文件中添加字符串将此库连接到我的应用程序:

DEPENDPATH += ../lib/mainlib
INCLUDEPATH += ../lib/mainlib
LIBS += -L../lib/build-mainlib-Desktop_Qt_5_7_0_MinGW_32bit-Release/release -lmainlib

运行项目,那个时候我遇到了这个问题:

QQmlApplicationEngine无法加载组件

qrc:/main.qml:18无法将对象分配给列表属性"数据";

资产:"!isEmpty(("在文件C:\Program中>Files\Qt\5.7\mingw53_32\include/QtCore/qlist.h,第341行

我的一块";one.h";文件:

#ifndef ONE_H
#define ONE_H
#include "mainlib_global.h"
#include <QObject>
class MAINLIBSHARED_EXPORT One : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString  port_number READ get_port_number WRITE set_port_number)
    Q_PROPERTY(QString  port_speed READ get_port_speed WRITE set_port_speed)
    Q_PROPERTY(QString  x READ get_x WRITE set_x)
    Q_PROPERTY(QString  y READ get_y WRITE set_y)
public:
    One();
    ~One();
    QString get_port_number(void);
    ...
signals:
    void portOpened(QString str);
    ...
private:
    QString port_number;
    QString x;
    QString y;
};
#endif // ONE_H

"mainlib_global.h":

#ifndef MAINLIB_GLOBAL_H
#define MAINLIB_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(MAINLIB_LIBRARY)
#  define MAINLIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define MAINLIBSHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // MAINLIB_GLOBAL_H

"mainlib.pro":

QT       -= gui
TARGET = mainlib
TEMPLATE = lib
DEFINES += MAINLIB_LIBRARY
SOURCES += one.cpp
HEADERS += one.h
        mainlib_global.h
unix {
    target.path = /usr/lib
    INSTALLS += target
}

我的一块";main.qml";文件,我在其中声明了我的一个类的对象:

import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.0
import OneClass 1.0
import QtQuick.Dialogs 1.1
Window {
    id: mainWindow
    visible: true
    width: 1000
    height: 720
    minimumWidth: 930
    color: "lightgrey";
    property bool connected: false
    
    // Object declaration
    One {id: objOne}
    ...
    }

我的一块";main.cpp";文件:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtSerialPort/QSerialPortInfo>
#include <QDebug>
#include "one.h"
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QLocale::setDefault(QLocale::c());
    qmlRegisterType<One>("OneClass", 1, 0, "One");
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    ...
    return app.exec();
}

我的应用程序.pro文件:

TEMPLATE = app
DEPENDPATH += ../lib/mainlib
INCLUDEPATH += ../lib/mainlib
LIBS += -L../lib/build-mainlib-Desktop_Qt_5_7_0_MinGW_32bit-Release/release -lmainlib
QT += qml quick serialport
CONFIG += c++11
win32: RC_ICONS += icon.ico
SOURCES += main.cpp 
    #one.cpp
RESOURCES += qml.qrc
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
# Default rules for deployment.
include(deployment.pri)
HEADERS += 
    #one.h

如果取消注释";one.h";以及";one.cpp";将它们与应用程序一起编译,不会出现这个问题,而且一切都很好。但当评论他们与图书馆合作时,我得到了这个";无法将对象分配给列表属性";数据"问题

我尝试通过右键单击项目连接库->添加库,但结果相同。我已经阅读了关于";数据";属性,试图显式地将对象声明分配给";数据";,但得到了同样的结果。尝试:

resources: [
    One {id: objOne}
]

并且得到了";无法将对象分配给列表属性";资源"&";。我只是为解决这个问题而疲惫不堪。我几乎每一步都在描述你,因为我想也许我做错了什么?我在乞求帮助。。。

一个可能的解决方案是声明一个新属性并将其绑定到一个新的"One"组件:

Window {
    property One objOne: One { }
}

但是正如您将看到的,这可能会导致其他(线程(问题。不要这么做!

我强烈建议您使用Qt内置插件机制。它的设计完全符合您的要求:导入外部动态QML库。检查文档:http://doc.qt.io/qt-5/qtqml-modules-cppplugins.html