Macos qt 5.8 os x在GUI应用程序打开时捕获传递的参数
环境:Qt 5.8,OS X/MacOS 12.6.8 我已经编写了一个图像编辑应用程序。它有两种自己的图像格式;如果它们被选择在finder中打开,我希望它能够打开它们。我已经告诉finder,他们应该用应用程序打开,这样做之后,当我尝试打开图像文件时,应用程序确实会打开,但我没有看到应用程序中的参数。当我这么做的时候Macos qt 5.8 os x在GUI应用程序打开时捕获传递的参数,macos,qt,user-interface,arguments,Macos,Qt,User Interface,Arguments,环境:Qt 5.8,OS X/MacOS 12.6.8 我已经编写了一个图像编辑应用程序。它有两种自己的图像格式;如果它们被选择在finder中打开,我希望它能够打开它们。我已经告诉finder,他们应该用应用程序打开,这样做之后,当我尝试打开图像文件时,应用程序确实会打开,但我没有看到应用程序中的参数。当我这么做的时候 QStringList qsl = QApplication::arguments(); …我得到一个长度为1的列表,其中第0个条目是预期的应用程序路径+名称,没有第二个(第
QStringList qsl = QApplication::arguments();
…我得到一个长度为1的列表,其中第0个条目是预期的应用程序路径+名称,没有第二个(第1个)条目,尽管我右键单击了我的文件并选择了“打开”
所以OSX/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);
}
};
#包括
#包括
QString appParam=“”;
bool-caughtParam=false;
类MyApplication:公共QApplication
{
公众:
MyApplication(int&argc,字符**argv)
:q应用程序(argc、argv)
{
}
布尔事件(QEvent*事件)
{
如果(事件->类型()==QEvent::FileOpen)
{
QFileOpenEvent*openEvent=静态_转换(事件);
appParam=openEvent->file();
caughtParam=true;
}
返回QApplication::event(事件);
}
};
…基本上,您将QApplication子类化,如图所示重新实现事件,然后对传入的信息执行(某些操作)。然后,不要在应用程序中使用QApplication
,而是使用MyApplication
,捕获数据,然后在完成设置后,处理参数
在这里,我设置了一个全局标志并存储了参数,然后稍后再获取它
这对一个参数有效,这就是我想要的。试图打开两个文件导致OSX投诉
如果您要对windows进行交叉编译,则需要有条件地在中编译,并在那里使用QApplication
;根据文档,这部分arcana仅针对OS X实现。