无法在 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 应用程序打开文件的主要内容,如果未能解决你的问题,请参考以下文章