Macos qt 5.8 os x在GUI应用程序打开时捕获传递的参数

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个条目是预期的应用程序路径+名称,没有第二个(第

环境:Qt 5.8,OS X/MacOS 12.6.8

我已经编写了一个图像编辑应用程序。它有两种自己的图像格式;如果它们被选择在finder中打开,我希望它能够打开它们。我已经告诉finder,他们应该用应用程序打开,这样做之后,当我尝试打开图像文件时,应用程序确实会打开,但我没有看到应用程序中的参数。当我这么做的时候

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实现。