在做Qt項目的時候,我們難免遇到到文件路徑問題。 如QFile file("text.txt")加載不成功、QPixmap("../text.png") 加載圖片不成功等等。今天就來做一個關於Qt路徑問題的小結!
首先需要弄清楚兩個概念:絕對路徑與相對路徑
絕對路徑: 文件在硬盤上真正存在的路徑。例如“text.jpg”這個圖片是存放在硬盤
的“E:\book\目錄下,那么 “text.jpg”這個圖片的絕對路徑就是“E:\book\text.jpg"
相對路徑:由這個文件所在的路徑引起的跟其它文件(或文件夾)的路徑關系
如當前file1的路徑是/user/File/file1/file1.txt,
File2的路徑是/user/File/file2/file2.txt
那么file2相對於file的路徑就是“../file2/file2.txt”。
相對路徑里常使用“../”來表示上一級目錄
弄清楚了上面兩個概念,在來弄清楚我們常用到的“:/”與"./":
./ : 表示當前路徑 如“./log/log1.txt” 表示當前路徑下的log目錄下的log1.txt。
:/ : 表示對資源的引用,引用資源文件路徑 如“:/image/start.png” 表示資源文件里面定義的文件start.png。
現在我們來解釋下QFile file("text.txt")加載不成功 ,如果text.txt是在可執行文件同級目錄下,是可以打開的
的,否則則打不開
下面講幾個Qt常用的獲取路徑的函數
1 .獲取應用程序可執行文件所在的目錄: QCoreApplication::applicationDirPath();
QString applicationDirPath; applicationDirPath = QCoreApplication::applicationDirPath(); qDebug()<<"applicationDirPath"<<applicationDirPath;
2.獲取應用程序可執行文件的文件路徑: QCoreApplication::applicationFilePath();
QString applicationFilePath; applicationFilePath = QCoreApplication::applicationFilePath(); qDebug()<<"applicationFilePath"<<applicationFilePath;
3.獲取應用程序當前工作目錄的絕對路徑:QString QDir::currentPath() (這個類似於“./”操作)
QString currentPath; QDir dir; currentPath=dir.currentPath(); qDebug()<<"path"<<currentPath;
將相對路徑轉化為絕對路徑:
QDir temDir("../../image.png"); QString filePath = temDir.absolutePath();
這樣就獲得了一個文件的絕對路徑了。
再來講講Qt資源系統:Qt 資源系統是一個跨平台的資源機制,用於將程序運行時所需要的資源以二進制的形式存儲於可執行文件內部。 如果你的程序需要加載特定的資源(圖標、文本翻譯等), 那么,將其放置在資源文件中,就再也不需要擔心這些文件的丟失。也就是說,如果你將資源以資源文件形式存儲,它是會編譯到可執行文件內部。
所以再來講講Qt資源文件qrc文件的創建。
方法1、使用qtdesinger創建.qrc文件
(1)在資源管理器窗口中選擇新建一個資源文件.qrc,保存文件即可;
(2)在資源管理器窗口中選擇添加資源和文件即可;
方法2、手工寫文件的方法,.qrc可以用記事本打開,大概的形式是這樣的:
<RCC> <qresource prefix="/" > //前綴 <file>image/text.png</file> </qresource> </RCC>
然后在pro文件中添加一句
RESOURCES = xxx.qrc
這樣在使用的時候QPixmap(":/image/text.png");就能加載成功了
同時為了以后我們修改text.png路徑的時候我們還需要一處處的修改源代碼,所以在建立資源qrc的時候,給每個資源文件起一個別名
如 :
<RCC> <file alias="image_copy.png">images/copy.png</file>
</RCC>
這時該文件可以通過QPixmap(":/image_copy.png");能加載成功。
但通過QPixmap(":/images/copy.png");加載不成功,QT里“:/”表示對資源的引用,不是表示當前目錄
==>使用別名是為了日后資源文件路徑改變而去改動源代碼。用別名后,只需要修改qrc文件即可!