环境:Qt 5.8、OS X/MacOS 12.6.8
我编写了一个图像编辑应用程序。它有几种自己的图像格式;如果选择在取景器中打开它们,我希望它能够打开它们。我告诉 finder 他们应该使用应用程序打开,这样做后,当我尝试打开图像文件时,应用程序会打开,但我没有在应用程序中看到该参数。当我这样做时...
QStringList qsl = QApplication::arguments();
...我得到一个长度为 1 的列表,其中第 0 个条目是预期的应用程序路径+名称,并且没有第二个(第 1 个)条目,尽管我右键单击了我的文件并选择了“打开” .
所以 OS X/MacOS 知道打开我的应用程序,并且(大概)它以某种方式告诉应用程序要打开哪个文件,但它不在参数列表中。
我也尝试过...
QStringList qsl = qApp->arguments();
...并在 main()
中而不是在 MainWindow()
中执行此操作。
所有情况下的结果相同。
我在这里缺少什么?
最佳答案
好的,我找到了它并开始工作了。它非常隐蔽,而且一点也不明显,但这是在 OS X 中打开文件的关键,QFileOpenEvent
...
#include <QApplication>
#include <QFileOpenEvent>
QString appParam = "";
bool caughtParam = false;
class MyApplication : public QApplication
{
public:
MyApplication(int &argc, char **argv)
: QApplication(argc, argv)
{
}
bool event(QEvent *event)
{
if (event->type() == QEvent::FileOpen)
{
QFileOpenEvent *openEvent = static_cast<QFileOpenEvent *>(event);
appParam = openEvent->file();
caughtParam = true;
}
return QApplication::event(event);
}
};
...基本上,您可以子类化 QApplication,重新实现如图所示的事件,然后对传入的信息执行(某些操作)。然后,不要使用 QApplication
在您的应用程序中,您使用 MyApplication
,抓取数据,然后设置好之后,就去处理参数了。
在这里,我设置了一个全局标志并存储了参数,然后稍后再获取它。
这适用于一个参数,这就是我所追求的。尝试打开两个文件会导致 OS X 投诉。
如果您要对 Windows 进行交叉编译,则需要有条件地编译它并仅使用 QApplication
那里;根据文档,这一点 arcana 仅针对 OS X 实现。
关于macos - qt 5.8 os x 在 GUI 应用程序打开时捕获传递的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51583665/