2017-02-24 25 views
1

私のメインのQMLファイルでは、MediaPlayerを定義しました。 (QAudioProbeを経由して)メディアバッファへのアクセスを低レベルにするには、mediaObjectへの参照を取得する必要があります。私のC++バックエンドは、qmlRegisterSingletonTypeによって登録されたクラスを通してUIとインターフェースします。qmlRegisterSingletonTypeのコールバックからQML読み込み項目にアクセスするにはどうすればよいですか?

main.cppに

int main(int argc, char *argv[]) 
{ 
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 
    QGuiApplication app(argc, argv); 
    qmlRegisterSingletonType<BackendInterface>("_", 0, 1, "Backend", backendInterfaceProvider); 
    QQmlApplicationEngine engine; 
    engine.load(QUrl(QLatin1String("qrc:/main.qml"))); 

    return app.exec(); 
} 

そして、ここでコールバックです:

static QObject *backendInterfaceProvider(QQmlEngine *engine, QJSEngine *scriptEngine) 
{ 
    Q_UNUSED(engine) 
    Q_UNUSED(scriptEngine) 

    return new BackendInterface(/* need a QMediaPlayer* here*/); 
} 

質問

私は私のバックエンドインターフェイスを作成していたときにQMLの階層構造にアクセスする方法(すなわちBackendInterface)?

答えて

3

シングルトンタイプのオブジェクトを使用しているため、最初の使用時にオブジェクトが作成されるため、MediaPlayerオブジェクトがまだ存在しない可能性があります。

QMLからMediaPlayerを取得する代わりに、QMLをC++でオブジェクトに「登録」する、つまりオブジェクトをシングルトンに渡します。

何か

class BackgroundInterface : public QObject 
{ 
    Q_OBJECT 

public: 
    Q_INVOKABLE void registerMediaPlayer(QObject *player); 
}; 

MediaPlayer { 
    id: mediaPlayer 

    Component.onCompleted: Backend.registerMediaPlayer(mediaPlayer) 
} 
のような
関連する問題