0

QtQuick Android アプリケーションを登録して、特定のクラスのファイルを開いて処理しようとしています。

私が収集したものから、ファイルが で開かれると、解雇されますQApplicationQEvent::FileOpen

これについて私が持っている最も強力な (決定的でない場合) 証拠は、実稼働システムで見つかったこのコミット、および多数のブログ投稿と Google の検索結果です。

そこで、まず新しい空の 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 エミュレーターでアプリケーションを起動します。

.fooNexus 5、API 22 を使用して AVD で ES ファイル エクスプローラーからファイルを開くと、アプリケーション確かにフォアグラウンドに移動しますが FileOpenイベントはログに記録されません。

フィルター メソッド内にブレークポイントを設定すると、ヒットしていないようです。

これは私を困惑させます。

ほぼ同じ結果(ヒットなし)で拡張QApplicationおよびオーバーロードすることにより、別のアプローチを試しました。event(QEvent *)

私は何が間違っているのでしょうか?


この MWE の完全なリポジトリは、こちら にあります

4

1 に答える 1

2

Bogdan のチュートリアル#qtを熟読し、Freenodeから非常に貴重な支援を受けた後、私自身の質問に答えるつもりです。

Android でファイルを開いて、実際にはQEvent::FileOpen、ウィンドウ マネージャーを備えたシステムでのみ役立つ .

代わりに、Java でサブクラス化QtActivityしてオーバーライドonIntentし、JNI で適切な C++ メソッドを呼び出す必要があります。

package com.foo;

import android.content.Intent;

import org.qtproject.qt5.android.bindings.QtActivity;

class Bar
{
    public static native void openUri(String uri);
    // Notice the 'native' keyword
}

public class MyActivity extends QtActivity {
    public void onNewIntent(Intent i) {
        if (i.getAction() == Intent.ACTION_VIEW) {
            Bar.openUri(i.getData().toString());
        }
        super.onNewIntent(i);
    }
}

class URIHandler : public QObject {
public:
    void openUri(QString uri) {
        qDebug() << "Open URI" << uri;
    }
}

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL
  Java_com_foo_Bar_openUri(JNIEnv *env,
                                                    jobject obj,
                                                    jstring uri)
{
    jboolean isCopy;
    isCopy = false;
    const char* utf = env->GetStringUTFChars(uri, &isCopy);
    handler.openUri(QString(utf));
    env->ReleaseStringUTFChars(uri, utf);

}

#ifdef __cplusplus
}
#endif

JNI メソッド名には微妙な点があることに注意してください。

この例の更新された実用的なバージョンは、ここにあります

于 2015-10-01T19:40:50.413 に答える