我开发了一个应用程序(使用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);
}
答案 0 :(得分: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获取资源目录。
请参阅this note以确定存储该信息的最佳位置(但您可以使用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'
...
答案 1 :(得分:0)
嗯,通常我不会回答我自己的问题,但由于缺乏回应,这是必要的。
有关图像的问题已经使用资源文件解决了,但是其他文件(例如声音)也会出现同样的问题,并且相同的配方对此不起作用。
执行应用程序时,程序采用我当前的目录作为基本目录,然后问题。
解决方案是创建一个Bash脚本,如下所示:
#!/bin/bash
$ cd /path/to/myprogram/
$ ./myprogram
并将其放入/usr/local/bin/
或/usr/bin/
。
也许这不是最佳解决方案,但它确实有效。如果有人有更好的解决方案,请分享。