2

QWebView で Google のログイン ダイアログを表示しようとしていますが、思い出すと、Google はキーボード フォーカスをページの最初の入力フィールド (この場合は電子メール フィールド) に設定するのが好きです。

残念ながら、QWebView ウィジェットは実際にはこの動作を尊重しないため、キーボード フォーカスがまったくない状態でページを読み込みます。

フォーカスのないログイン ダイアログ

そこで、少し掘り下げて、次のコード スニペットをクラス ロジックに挿入することにしました。

void GoogleAuthDialog::pageLoaded(bool ok) {
    if (ok) {
        ui->webView->setFocus();
        ui->webView->page()->mainFrame()->setFocus();
        QWebElement el = ui->webView->page()->mainFrame()->findFirstElement("input:not([type=hidden])");
        if (!el.isNull()) {
            el.setFocus();
            el.evaluateJavaScript("this.focus()");
            el.evaluateJavaScript("this.click()");
        }
    }
}

そして、ヘッダーファイルの次の宣言:

...
private slots:
    void pageLoaded(bool);

クラス コードに戻り、適切な信号を QWebView からスロットに接続しました。

connect(ui->webView, SIGNAL(loadFinished(bool)), this, SLOT(pageLoaded(bool)));

はい、キーボードのフォーカスを最初の入力ボックスにリダイレクトするために、考えられるすべてのことを投げかけています。

残念ながら、コードは機能していないように見えました。正しい入力ボックスにフォーカスしていたにもかかわらず、自分でクリックするか、Tab キーを押すまで、その中に何も入力できませんでした。

キーボードなしで集中

次に、関数を Control キーにバインドすると、奇妙な結果が得られました。

手動でパスワード フィールドにフォーカスを置いて Control キーを押すと、パスワード フィールドに引き続きキーボード フォーカスがあり、電子メール フィールドに「視覚的な」フォーカスがあることに気付きました。

間違ったフィールドのキーボード キャレット

また、この「状態」で何かを入力すると、ビジュアルとキーボードのフォーカスがパスワード フィールドに「リセット」される前に、メール フィールドに文字が「漏れる」ことがありました。

文字漏れ

選択した入力フィールドにキーボード フォーカスをリダイレクトする適切な方法はありますか?

4

2 に答える 2