QT経路問題


本論は次から次へ
http://blog.csdn.net/dbzhang800/article/details/6363165
実用的な文章
Qtフォーラムではよくネットユーザーの苦情を見ます.
  • QPixmap("dbzhang 800.png")画像のロードが失敗しました.
  • QFile(「dbzhang 800.txt」)ファイルのオープンに失敗しました.
  • このような問題にぶつかると、私は主に答えます. "プログラムとのディレクトリ .しかし、この答えはあまりにも青白く見えるようです.それなら、整理してみましょう.
  • は相対パスを使っています.相対はそのディレクトリに対してのものですか?
  • Qtに文句を言う時、それはQtと関係がないと知っていますか?
    QtはC++のライブラリです.やはりC++から見ましょう.  ISO C++で自分の信号溝を実現します.
     および  C++からQtまで 
    興味があります
    相対パス
    文書に接触したばかりの時は、このような簡単な手続きを書いたことがあるでしょう.
    #include <stdio.h>
    
    int main()
    {
       FILE * pFile = fopen ("dbzhang800.txt" , "r");
       if (pFile == NULL) {
           perror ("Error opening file");
       } else {
         //do something
         fclose (pFile);
       }
       return 0;
    }
    実行可能ファイルの同級ディレクトリの下にdbzhang 800.txtファイルを置いてコンパイラを呼び出します.
    cl abc.cpp
    または
    g++ abc.cpp -o abc
    そしてプログラムabcを実行して、すべて正常ですか?
    そのせいか、多くの人が誤解しています. :相対的なディレクトリはアプリケーションのディレクトリです.
    試したことがありますか?
    |-- dir1/
    |    |-- abc(.exe)
    |    `-- dbzhang800.txt
    |
    `-- dir2/
    端末(またはcmdウィンドウ)でディレクトリーをdir 2に切り替えて、プログラムを実行すれば、あなたのプログラムはテキストファイルを見つけることができますか?
    それを見つけたいなら、ファイルはどのディレクトリに置くべきですか?
    作業目録
    相対的な経路に遭遇したら、必ず作業目録を回ります.これは現在の作業目録とも言われています. urrent  w orking d irectory)は、すべての相対的な経路を作業ディレクトリから説明します. 私たちはchdirを通過することができます. などの関数がプロセスの作業ディレクトリを変更します.
    前の例をつないで、もしあなたが本当に仕事の目次に対して感じがないならば、直接に自分で見てみます.(ネット上では他のposixなどの提供する関数を見るかもしれません.私達はISO C++標準の関数だけを使います.)
    #include <direct.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    int main( void )
    {
       char* buffer;
       if( (buffer = _getcwd( NULL, 0 )) == NULL ) {
          perror( "_getcwd error" );
       } else {
          printf( "Current Dir: %s /n", buffer);
          free(buffer);
       }
    }
  • 現在の作業ディレクトリ
  • を取得するために、_getcwdを呼び出します.
  • は、端末またはcmdで他のディレクトリに切り替えることができ、絶対パスを介してあなたのこのプログラムを呼び出し、出力
  • を観察します.
  • リンxでランチャーを作成して、ランチャーに作業ディレクトリを設定することができます.
  • もしあなたがwindowsの下にいるならば、そのためにショートカットを作成することができます.ショートカットの属性にはワークディレクトリを設定/変更することができます.
    作業用ディレクトリの変更
    つまらない例を見てください.
    #include <stdio.h>
    #include <direct.h>
    
    int main()
    {
        _chdir("c://temp");
    
       FILE * pFile = fopen ("dbzhang800.txt" , "r");
       if (pFile == NULL) {
           perror ("Error opening file");
       } else {
         //do something
         fclose (pFile);
       }
       return 0;
    }
  • 使用  _chdir   ワークディレクトリを変更する
  • 今、プログラムはCディスクtempディレクトリのテキストファイル
  • を開きます.
    注:_chdir   和  _getcwd 幅のある文字(wchar t)のバージョンがあります.ここでは関連していません.(幅の広い文字を使うなら、まずこの文のCソースファイル内の中国語(2)を見てみてください. ).
    Qtに戻る
    QtはC++のライブラリですので、上のものはそのまま使ってもいいですが、Qtはもっと使いやすいものを提供してくれますので、Qtの中で前述のC、C++の中関数を使うとは考えられないと思います.
    注意:もしあなたが操作するファイルが読み取り専用で、プログラムのコンパイルが完了した後、これらのファイルは変化が必要ではない場合、まずQtを採用するリソースファイルを考慮してください.
    下:前の二つの関数のQt中の等価物を見てみましょう.
    作業ディレクトリを取得
    作業ディレクトリにまだ慣れていない場合、相対パスを使って問題が発生した場合、まず下記の文を使うことを考えてください.
    qDebug()<<QDir::currentPath();
    あなたの予想通りですか?
    作業ディレクトリを変更
  • この操作はめったに必要ありません.
  • 使ったら、注意してください.
    bool QDir::setCurrent ( const QString & path ) [static]
  • ではありません.
    bool QDir::cd ( const QString & dirName )
    bool QDir::cdUp ()
    void QDir::setPath ( const QString & path )
    プログラムの場所
    どのようにしてあなたのプログラムを知っていますか?それはプラットフォームと関連した問題です.(ISO C、C++はまだ答えを教えてくれないようです.)幸いにQtは良いパッケージを提供しました.
    QString QCoreApplication::applicationDirPath () [static]
    相対パスを使ってプログラムを実行できる同じディレクトリのファイルにアクセスしたいなら、作業ディレクトリをディレクトリに設定してもいいです.
    あるいは(これはより良い方法であるべきです.)このディレクトリとあなたの相対パスを使って、まず直接に絶対パスに結合してから使用します.
    しかし ,この問題がありますか?私たちはwindowsでQtを使うと、生成された実行可能なプログラムがdebugまたはreleaseディレクトリの下にあります.私たちが訪問するファイルはproject.proファイルのディレクトリ(またはそのサブディレクトリ)の下にあります.これはどうすればいいですか?
    有用な関数
    プロジェクトディレクトリのdoc/dbzhang 800.txtファイルにアクセスしたい場合:
    |-- project.pro
    |-- doc/
    |     `-- dbzhang800.txt
    |
    |-- release/
    |     `-- abc.exe
    |
    `-- debug/
          `-- abc.exe
    直接
    QFile(doc/dbzhang800.txt);
    いいですか?Qt Creatorなどの環境下で運行すれば、普通は仕事ができますが、debugの下でダブルクリックしても仕事がなくなります.
    問題の解決策はC++GUI Qt 4のプログラムから来ました.きっとこの関数を見たことがあると信じています.
    QDir directoryOf(const QString &subdir)
    {
        QDir dir(QApplication::applicationDirPath());
    
    #if defined(Q_OS_WIN)
        if (dir.dirName().toLower() == "debug"
                || dir.dirName().toLower() == "release"
                || dir.dirName().toLower() == "bin")
            dir.cdUp();
    #elif defined(Q_OS_MAC)
        if (dir.dirName() == "MacOS") {
            dir.cdUp();
            dir.cdUp();
            dir.cdUp();
        }
    #endif
        dir.cd(subdir);
        return dir;
    }
    この関数はどう使いますか?   私たちはただ必要です
    QFile(directoryOf("doc").absoluteFilePath(dbzhang800.txt));
    show build
    qmakeは早くからshow build機能を提供していますが、QtCreatorがデフォルトで使っていた機能については、ほとんどの人が気づき始めました.
    |-- project-sources/
    |       |-- project.pro
    |       `-- main.cpp
    |
    |-- build-vs2008/
    |       |-- Debug/
    |       |    `-- main.exe
    |       `-- Release/
    |            `-- main.exe 
    |-- build-vs2005/
    |-- build-mingw/
    |-- build-symbian/
    |-- build-dbzhang800/
    |-- ...
    ここには不思議なところがありません.ただ一般資料で紹介されているqmakeは全部このように言います.
    qmake project.pro
    make
    そして、qtcreatorはこうしています.
    cd ../build-vs2008
    qmake ../project-sources/project.pro
    make
    この場合、私たちは一般的にいくつかのファイルを構築ディレクトリにコピーする必要があります.具体的には参照できます.  チャットqmakeのshow build   最後に与えられたコード