Alex Spataru
Alex Spataru

Reputation: 1217

Parsing terminal arguments Qt Mac OS X

I have a simple text editor in which I would like to open a file when it's double-clicked from the system file manager.

I managed to do that without any problems under Ubuntu Linux (13.04), but in Mac OS X my code did not work.

After researching a bit, I found out that you need to add the --args argument in terminal in order to parse the arguments to main().

I fixed my code and now my application bundle can open files from the terminal, but when I double click a file in Finder (and select my app), my application launches as if did not receive any terminal arguments (creates a new file).

Here is the code of the main() function:

int main(int argc, char *argv[])
{
    QApplication MyApp(argc, argv);

    Textpad.setApplicationName("MyApp");
    Textpad.setApplicationVersion("0.7.2");

    Textpad.setWindowIcon(QIcon(":/app-icon/48x48/icon.png"));

    MainWindow *Window = new MainWindow();

    QString Arguments;
    QString FileLocation;

    if (argc != 1) {
        int i;
        for (i = 0; i < argc; i++)
            Arguments = argv[i];

        // Check if the OS is Mac OS X (Mac OS X is 3)
        if (Window->CheckOS() == 3)
            // Remove the "--args" so that we don't confuse it with the file location
            Arguments.replace("--args", "");

        if (Arguments == "--help") {
            // Show help
        }

        // Create a new file when Textpad is launched normally (under Linux)
        if (Arguments == "%U") {
            FileLocation.clear();
            // Load settings and create UI
            Window->Initialize();
            // Open the requested file
            Window->LoadFile(FileLocation);
        }

        else {
            FileLocation = Arguments;
            // Load settings and create UI
            Window->Initialize();
            // Open the requested file
            Window->LoadFile(FileLocation);   
        }
    }

    else {
        // Create new file
        FileLocation.clear();
        // Load settings and create UI
        Window->Initialize();
        // Open the requested file
        Window->LoadFile(FileLocation);
    }

    return MyApp.exec();
}

As I said before my application opens files without probles from the terminal when I write the following:

open MyApp.app --args <location of my file>

But fails when I try to open a file from Finder.

What I am missing?

Thank you in advance.

Upvotes: 1

Views: 1158

Answers (1)

Sebastian Lange
Sebastian Lange

Reputation: 4029

First of all, you will have to link against the OX-X Framework. OSX works with Events similar to signal slots. The filename will also be given by an apple event. I`ve had this quite some time ago with another language, but i still found a reference:

Edit doc now in Qt archive: https://doc.qt.io/archives/qq/qq12-mac-events.html

Upvotes: 1

Related Questions