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&&index qDebug()将Q_对象
宏添加到子类(ArchiveFile
)似乎可以解决这个问题。我错误地认为您只需要以某种方式在基类(GenericFile
)中定义Q_对象
宏