我正在尝试注册一个 QtQuick Android 应用程序来打开某类文件并处理它们。
据我所知,当使用 a 打开文件时,QApplication
会导致 aQEvent::FileOpen
被触发。
我所拥有的最有力的(如果不确定的话)证据是在生产系统中发现的这个提交,以及一些博客文章和谷歌结果。
所以,我首先创建一个新的空 QtQuick 项目。
然后我写一个 EventFilter,像这样:
#include <QtGui>
#include <QApplication>
#include <QFileOpenEvent>
class MyEventFilter : public QObject {
public:
MyEventFilter();
virtual ~MyEventFilter();
protected:
virtual bool eventFilter(QObject* object,QEvent* event);
};
#include "myeventfilter.h"
MyEventFilter::MyEventFilter() : QObject () {}
MyEventFilter::~MyEventFilter() {}
bool MyEventFilter::eventFilter(QObject* object,QEvent* e) {
qDebug() << "Received" << e->type();
if (e->type() == QEvent::FileOpen) {
QFile file(static_cast<QFileOpenEvent *>(e)->file());
qDebug() << "File to open:" << file.fileName();
// This is where I would do stuff
return true;
} else {
return QObject::eventFilter(object,e);
}
}
<intent-filter android:label="Foo File" android:priority="1">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="file" android:host="success"/>
<data android:host="*"/>
<data android:mimeType="*/*"/>
<data android:pathPattern=".*\\.foo"/>
</intent-filter>
此时,我在 Android 模拟器中启动了我的应用程序。
当我.foo
使用 Nexus 5、API 22 在我的 AVD 中从 ES 文件资源管理器打开文件时,我的应用程序确实被带到了前台,但没有 FileOpen
记录任何事件。
如果我在我的过滤器方法中设置了一个断点,我似乎没有命中它。
这让我很困惑。
我尝试了另一种方法,方法是扩展QApplication
和重载event(QEvent *)
几乎相同的结果(没有命中)。
我可能做错了什么?
请在此处找到此 MWE 的完整存储库。