Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ qml未知方法返回类型:ArchiveFile*,即使调用了qmlregisteruncreateabletype 简要描述我正在尝试做的事情_C++_Qml_Qt5 - Fatal编程技术网

C++ qml未知方法返回类型:ArchiveFile*,即使调用了qmlregisteruncreateabletype 简要描述我正在尝试做的事情

C++ qml未知方法返回类型:ArchiveFile*,即使调用了qmlregisteruncreateabletype 简要描述我正在尝试做的事情,c++,qml,qt5,C++,Qml,Qt5,我正试图申请打开一些结构非常相似的相关文件。有一个名为GenericFile的基类和一个名为ArchiveFile的子类。还有ArchiveFile的子类,这些子类包含特定归档文件格式的实现逻辑,但这些子类与QML无关,因此不向QML公开 我还有一个名为FileManager的类,它将某些方法公开给QML,以创建GenericFile的实例,并根据GenericFile.getFileCategory将它们向下转换为类,如ArchiveFile 问题 我已经使用qmlregisteruncrea

我正试图申请打开一些结构非常相似的相关文件。有一个名为
GenericFile
的基类和一个名为
ArchiveFile
的子类。还有
ArchiveFile
的子类,这些子类包含特定归档文件格式的实现逻辑,但这些子类与QML无关,因此不向QML公开

我还有一个名为
FileManager
的类,它将某些方法公开给QML,以创建
GenericFile
的实例,并根据
GenericFile.getFileCategory
将它们向下转换为类,如
ArchiveFile

问题 我已经使用
qmlregisteruncreateabletype
注册了
GenericFile
ArchiveFile
,如下所示:

int main(int argc,char**argv){
QApplication应用程序(argc、argv);
qqmlaplicationengine;
qmlregisteruncreateabletype(“me.henkkalkwater”,1,0,“GenericFile”,“使用文件管理器获取GenericFile的副本!”);
qmlRegisterUncreatableType(“me.henkkalkwater”,1,0,“ArchiveFile”,“使用文件管理器获取您的ArchiveFile副本!”);
qmlRegisterSingletonType(“me.henkkalkwater”,1,0,“FileManager”,[](QQmlEngine*engine,QJSEngine*jsEngine)->QObject*{
Q_未使用(发动机)
Q_未使用(jsEngine)
返回新的文件管理器();
});
const-QUrl(QStringLiteral(“qrc:/qml/main.qml”);
QObject::connect(&engine),&QQmlApplicationEngine::objectCreated,
&应用程序,[url](QObject*obj,const-quorl和objUrl){
如果(!obj&&url==objUrl)
QCoreApplication::退出(-1);
},Qt::QueuedConnection);
引擎加载(url);
}
调用
GenericFile*FileManager.getFile(int-index)
在QML中工作正常。但是调用
ArchiveFile*FileManager.getArchive(int-index)
不起作用,并显示消息“Error:Unknown method return type:ArchiveFile*”

问题与
ArchiveFile
继承自
GenericFile
这一事实有关,还是我在其他地方犯了一个愚蠢的错误?还是我的课程设计有严重缺陷?我是否将C++的一些java约定应用到C++中,应该用另一种方式来做? 我的代码 genericfile.h:

类通用文件;
typedef GenericFile*(*CreateFileFunction)(QIODevice*文件,QString文件名,QObject*父级);
类GenericFile:公共QObject{
Q_对象
公众:
枚举文件类别{
不详,
压缩的,
档案文件
布局
};
Q_枚举(文件类别)
GenericFile(QIODevice*源,QString名称,QObject*父项=nullptr);
虚拟文件();
Q_属性(QString文件名读取getFileName)
Q_属性(FileCategory FileCategory读取getFileCategory)
/**
*@brief使用指定的魔法字节字符串注册文件。
*@param-magic
*@param-fn
*/
静态无效注册表文件(qlatin1stringmagic,CreateFileFunction fn);
/**
*@brief返回文件的一个子类。
*@param file要确定的文件。
*@返回能够解析此文件格式的类。
*
*扫描魔法字节并返回表示该文件的GenericFile的子类。
*子类将获得QFile的所有权,并在QFile被销毁时销毁它
*本身。
*/
静态GenericFile*fromFile(QFile*file,QObject*parent=nullptr);
来自IODevice的静态GenericFile*(QIODevice*文件,QString文件名,QObject*父项=nullptr);
/**
*@brief初始化默认文件关联。
*/
静态void init();
/**
*@返回此文件的文件名
*/
QString getFileName()常量{
返回文件名;
}
/**
*@return返回文件所属的常规类别
*/
虚拟文件类别getFileCategory()常量{
返回未知;
}
受保护的:
QIODevice*文件;
QString文件名;
};
archivefile.h

class ArchiveFile:公共泛型文件
{
公众:
ArchiveFile(QIODevice*设备,QString文件名,QObject*父项=nullptr);
Q_可调用
虚拟QList listContents()=0;
FileCategory getFileCategory()常量重写{返回GenericFile::ARCHIVE;}
};
h(包括相关的方法实现)

类文件管理器:公共QAbstractListModel
{
Q_对象
公众:
显式文件管理器(QObject*parent=nullptr);
罗莱内斯枚举{
INDEX=Qt::UserRole+1,
路径
类型,
类别
};
/**
*@brief打开一个文件
*@param filePath文件的路径
*@如果打开失败,返回false,否则返回true
*打开一个文件,如果成功,则返回true并将其添加到此模型。否则,将返回false。
*/
Q_可调用
bool openFile(QUrl filePath);
Q_可调用
GenericFile*getFile(int索引){
如果(索引>=0&&indexqDebug()将
Q_对象
宏添加到子类(
ArchiveFile
)似乎可以解决这个问题。我错误地认为您只需要以某种方式在基类(
GenericFile
)中定义
Q_对象