无法在 Mac 上使用 qt 应用程序打开文件

Posted

技术标签:

【中文标题】无法在 Mac 上使用 qt 应用程序打开文件【英文标题】:Unable to open file with qt app on mac 【发布时间】:2014-11-10 17:52:59 【问题描述】:

我正在尝试将自定义文件与 osx 应用程序相关联。我有一个将文件与应用程序关联的 plist,但双击文件会打开应用程序,其中没有数据。

打电话

someapp.app/Contents/MacOs/someapp somefile.abc

从终端在应用程序内正确打开文件。

MyApp::MyApp(int& argc, char**argv): QApplication(argc, argv)

  ...
  m_MainWindow = new MainWindows();
  m_MainWindow->show();
  if(argc > 1 && argv[1])
      m_MainWindow->openFile(QString(argv[1]);
  else 
      m_MainWindow->showStartupDialog();  // to create a new document

四处搜索我发现我应该以某种方式实现QFileOpenEvent... 怎么样? 这个example看起来不错……但是我不明白怎么把构造函数和事件结合起来……

我该如何进行这项工作?

(OS X 10.6-10.9,使用 Qt 4.8 创建的应用)

【问题讨论】:

【参考方案1】:

以下是修改后的代码,它将在启动时或正常运行期间响应OpenFileEvent - 并且还允许从命令行打开文件或创建新文件

MyApp::MyApp(int& argc, char**argv): QApplication(argc, argv)

  ...
  m_MainWindow = new MainWindows();
  m_MainWindow->show();
  if(argc > 1 && argv[1])
      m_MainWindow->openFile(QString(argv[1]);
  else if (m_macFileOpenOnStart != "")
      m_MainWindow->openFile(m_macFileOpenOnStart);  // open file on start if it exists
  else 
      m_MainWindow->showStartupDialog();  // to create a new document


 // responds to FileOpenEvent specific for mac
 bool MyApp::event(QEvent *event)
 
    switch(event->type())
    
    case QEvent::FileOpen:
    
        QFileOpenEvent * fileOpenEvent = static_cast<QFileOpenEvent *>(event);
        if(fileOpenEvent)
        
            m_macFileOpenOnStart = fileOpenEvent->file();
            if(!m_macFileOpenOnStart.isEmpty())
            
                if (m_MainWindow)
                
                    m_MainWindow->openFile(m_macFileOpenOnStart);  // open file in existing window
                
                return true;
            
        
    
    default:
        return QApplication::event(event);
    
    return QApplication::event(event);
 

【讨论】:

你能解释一下为什么这个例子有一个default switch/case 返回以及一个标准的函数返回(这不是多余的吗?) @QZSupport - 可能它本来可以写得更好 - 默认情况下只有一个“中断” - 它确实是一回事。函数返回不是多余的,因为在第一种情况下没有处理路径。 你能解释一下“函数返回不是多余的”这句话吗?在第一种情况下未处理的路径不会落入default 情况下吗? 默认情况只处理第一种情况不成立的情况;【参考方案2】:

我正在使用 QApplication 派生类,它会在文件准备好时发出信号:

#ifndef OPENWITHAPPLICATION_H
#define OPENWITHAPPLICATION_H

#include <QApplication>
#include <QFileOpenEvent>
#include <QMessageBox>


class OpenWithApplication : public QApplication

    Q_OBJECT

public:
    QString fileName;

    OpenWithApplication(int &argc, char **argv)
        : QApplication(argc, argv)
    
    
signals:

    void fileReady(QString fn);

protected:

    bool event(QEvent *event)
    
        if (event->type() == QEvent::FileOpen) 
            QFileOpenEvent *openEvent = static_cast<QFileOpenEvent *>(event);
            fileName = openEvent->file();

            emit fileReady(fileName); //  the file is ready
        

        return QApplication::event(event);
    
;

#endif // OPENWITHAPPLICATION_H

main.cpp 将创建的 OpenWindowApplication 与 MainWindow 对象连接起来,因此一旦文件准备就绪,就会发出并接收信号以进行处理

#include "mainwindow.h"
#include <openwithapplication.h>

int main(int argc, char *argv[])

    OpenWithApplication a(argc, argv);
    MainWindow w;

    w.connectOpenWithApp(&a);
    w.show();

    return a.exec();

和 MainWindow 将 fileReady 信号与打开文件并更新小部件的 lambda 函数连接

void MainWindow::connectOpenWithApp(OpenWithApplication*app) 
    connect(app, &OpenWithApplication::fileReady, [this](QString fileName)
        bw->open(fileName);
        bw->update();
    );

结果如下:

【讨论】:

以上是关于无法在 Mac 上使用 qt 应用程序打开文件的主要内容,如果未能解决你的问题,请参考以下文章

Mac 上 Qt Creator 的单一文档界面

无法使用 Vim 在 Mac 上打开 LaTeX 文件,由 Python 引起?

无法在 mac 上打开 h2.jar

qt 无法打开stddef.h,最终解决方案

Qt Single Application 文件打开

教程篇macOS 10.15 MAC应用无法打开或文件已损坏处理方法