假设向一个QT的应用程序里添加了资源文件(icon.qrc),然后有在里面添加了下面的内容:
<RCC>
<qresource prefix="/image">
<file>image/DIW.ico</file>
</qresource>
<qresource prefix="/text">
<file>text/1.cpp</file>
</qresource>
</RCC>
看起来向下面的样子:
如果引用上述资源文件里的【1.cpp】,文件的路径应该是“:/text/text/1.cpp”,而不是“:/text/1.cpp”。
为什么?不必追问太多,直接到编译后形成的文件“qrc_icon.cpp”里找答案吧:
看到“qrc_icon.cpp”文件里的内容,有这么几点认识:
① 所添加的各种资源文件,最终被编译成unsigned char,放到字节数组qt_resource_data[]里了;
② 既然这些内容是在编译时已经创建,因此只能做“读”操作,如QFile::open(QIODevice::ReadOnly),而不能做写操作;
③ 每次改动外部被添加资源文件的内容,需要重新编译;
④ 当要使用外部资源文件为文本内容时,注意该文件的编码格式,可以使用常用的文本编辑器notepad++查看当前格式,在QT里要正确显示,或者为系统设置编码格式:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
或者在需要使用的地方,使用明确的编码格式,如下面的QString result字符串:
void MainWindow::readResult(int exitCode)
{
if(exitCode == 0) {
#if defined(Q_OS_WIN32)
QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");
QString result = gbkCodec->toUnicode(p->readAll());
#elif defined(Q_OS_LINUX)
QTextCodec* utfCodec = QTextCodec::codecForName("UTF-8");
QString result = utfCodec->toUnicode(p->readAll());
#endif
QMessageBox::information(this, "dir", result);
}
}
其他如“utf8”格式,总之要和文本文件的编码格式一致。
⑤ 可以将":/"传递到QDir中,枚举其下的文件内容,如下:
QDir d(":/");
qDebug()<<"absolutePath: "<<d.absolutePath();
qDebug()<<"dirName: "<<d.dirName();
foreach (QFileInfo info, d.entryInfoList())
{
qDebug()<<"absoluteDir: "<<info.absoluteDir();
qDebug()<<"absoluteFilePath: "<<info.absoluteFilePath();
qDebug()<<"absolutePath: "<<info.absolutePath();
//.....其他内容
}