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

标签 macos qt user-interface arguments

环境: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/

相关文章:

java - 如何连接 UI 和业务逻辑

java - 隐藏 JInternalFrame 的标题栏? -java

swift - 缩放图像 OSX Swift

python - PyInstaller 和 PySide,如何包含 imageformats 文件夹?

c++ - 用于类似对话框实现的 Qt5 和 Pattern

javascript - 蒙德里安网页布局

java - 如何在mac中通过java以编程方式启动appium服务器?

macos - 如何解决重新安装的安装错误?

Mac 上的 Java 开发 - Xcode、Eclipse 或 Netbeans

c++ - 使用 C++ 在我的应用程序的菜单栏中创建一个 "Save Current Setting"功能