0

背景とアイコンにいくつかの画像を使用するアプリケーション (Qt Creator を使用) を開発しました。今、私はそれを展開しようとしています.アプリケーションは正常にインストールされています:

$ make
$ sudo make install

インストール ディレクトリは/usr/local/ctimer/で、バイナリは にあり/usr/local/ctimer/ctimerます。問題は、たとえば Alt + F2 を使用してプログラムを実行すると/usr/local/ctimer/ctimer、画像が表示されないことです。

そのフォルダーからプログラムを実行すると、すべて正常に動作することに気付きました。

$ cd /usr/local/ctimer/
$ ./ctimer

上記のコマンドを含む bash スクリプトを使用して問題を回避し、/usr/local/bin/たとえばそれを配置することは可能ですが、この動作の理由を知りたいです。

何か案が?

編集:

コードは次のとおりです。

void Stopwatch::createMenu()
{
  startAction = new QAction(QIcon("pictures/start.png"), tr("&Start/Continue"), this);
  startAction->setToolTip("Start/Continue stopwatch");
  startAction->setShortcut(Qt::CTRL + Qt::Key_S);
  connect(startAction, SIGNAL(triggered()), this, SLOT(start()));

  pauseAction = new QAction(QIcon("pictures/pause.png"), tr("&Pause"), this);
  pauseAction->setToolTip("Pause stopwatch");
  pauseAction->setShortcut(Qt::CTRL + Qt::Key_P);
  connect(pauseAction, SIGNAL(triggered()), this, SLOT(pause()));

  resetAction = new QAction(QIcon("pictures/reset.png"), tr("&Reset"), this);
  resetAction->setToolTip("Reset stopwatch");
  resetAction->setShortcut(Qt::CTRL + Qt::Key_C);
  connect(resetAction, SIGNAL(triggered()), this, SLOT(reset()));

  countDownAction = new QAction(QIcon("pictures/down.png"), tr("&Countdown"), this);
  countDownAction->setToolTip("Create a custom count down");
  countDownAction->setShortcut(Qt::CTRL + Qt::Key_D);
  connect(countDownAction, SIGNAL(triggered()),
          countDownDialog, SLOT(show()));

  aboutAction = new QAction(QIcon("pictures/about.png"), tr("&About"), this);
  aboutAction->setToolTip("About this timer!");
  aboutAction->setShortcut(Qt::CTRL + Qt::Key_H);
  connect(aboutAction, SIGNAL(triggered()), aboutDialog, SLOT(show()));


  quitAction = new QAction(QIcon("pictures/quit.png"), tr("&Quit"), this);
  quitAction->setToolTip("Quit timer!");
  quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
  connect(quitAction, SIGNAL(triggered()), this, SLOT(close()));

  contextMenu = new QMenu(this);

  contextMenu->addAction(startAction);
  contextMenu->addAction(pauseAction);
  contextMenu->addAction(resetAction);
  contextMenu->addAction(countDownAction);
  contextMenu->addAction(aboutAction);
  contextMenu->addAction(quitAction);

  this->addAction(startAction);
  this->addAction(pauseAction);
  this->addAction(resetAction);
  this->addAction(countDownAction);
  this->addAction(aboutAction);
  this->addAction(quitAction);
}
4

2 に答える 2

1

アイコンについては、あなたと同じようにリソース ファイルを使用します。

実行可能ファイルのディレクトリ (または子ディレクトリ) 内に他のファイルを保存する場合は、から返された文字列を先頭に追加できますQCoreApplication::applicationDirPath()

QString prefix = QCoreApplication::applicationDirPath();
QIcon startIcon(prefix + "/pictures/start.png");
startAction = new QAction(startIcon, tr("&Start/Continue"), this);
...

ただし、これは Linux / Unix ファイルシステムには準拠していません。実行可能ファイルが含まれる可能性が高く、/usr/bin実際にはそのディレクトリにリソースを配置できないからです。リソースを別の場所 (例: /usr/share/yourapp) に保存し、そのディレクトリを/etcインストール中に別の場所に保存することもできます。次に、アプリケーションはQSettingsを介してリソース ディレクトリを取得します。

このメモを参照して、その情報を保存するのに最適な場所を決定してください (ただし、QSettings を使用して任意のファイルを読み取ることができます)。

QSettings settings(QSettings::SystemScope,
                   QCoreApplication::organizationName(),
                   QCoreApplication::applicationName());
// This points to /etc/xdg/MySoft.conf on Unix.

QString prefix = settings.value("resourcesDirectory");
// Inside /etc/xdg/MySoft.conf you have a 'resourcesDirectory'
// entry with value '/usr/share/MySoft/resources'

...
于 2012-08-20T03:49:05.847 に答える
0

ええと、通常、私は自分の質問に答えませんが、応答がないために必要です。

画像に関してはリソースファイルで解決しましたが、音声など他のファイルでも同様の問題が発生し、同じレシピではうまくいきません。

アプリケーションが実行されると、プログラムは現在のディレクトリをベース ディレクトリとして採用します。次に問題です。

解決策は、次のように Bash スクリプトを作成することです。

#!/bin/bash
$ cd /path/to/myprogram/
$ ./myprogram

/usr/local/bin/またはに入れ/usr/bin/ます。

これは最善の解決策ではないかもしれませんが、うまくいきます。誰かがより良い解決策を持っている場合は、それを共有してください。

于 2012-08-20T03:27:32.283 に答える