4

タブを押したときに完了を作成しようとしています。すべての可能性の最初の完了が得られます。

しかし、QWidgetベースのメイン ウィンドウでは、Tab キーを押すとQLineEditフォーカスが失われ、完了ポップアップはその後非表示になります。

それを修正する方法はありますか?

4

3 に答える 3

3

キープレス イベントをサブクラス化QLineEditし、インターセプトしようとしましたか?

または、イベント フィルターを設定することもできます。

于 2012-03-22T10:25:30.203 に答える
1

うわー。これを理解するのに少し時間がかかりました:)何度もこの問題を解決しようとしましたが、常にあきらめました。今、私は答えを見つけるのに十分掘り下げました。

OP、ご容赦ください。ここのコードは Python ですが、理解しやすく、C++ でも機能するはずです。

基本的に、私が抱えていた問題は「QCompleter でエントリを選択する方法」でした。今まで気がつきませんでしたが、答えはpopup()メソッドにあります。QCompleter は、表示するものを含むモデルとビューで動作します。

必要に応じて現在の行を変更し、モデル内のその行のインデックスを取得して、ポップアップで選択できます。

私のコードでは、 をサブクラス化し、 Tab が押されるたびに発行されるシグナルをQLineEdit作成しました。tabPressed次に、このシグナルを、これを行う同じクラスのメソッドに接続します。

  1. 現在のインデックスを取得します。
  2. ポップアップでインデックスを選択します。
  3. 次の行に進みます。

実装としては、これは非常に些細なことですが、私の現在の目的にはこれで十分です。これがスケルトンです(タブ部分だけで、モデルとその他すべてが欠落しています)。

class MyLineEdit(QLineEdit):
    tabPressed = pyqtSignal()

    def __init__(self, parent=None):
        super().__init__(parent)
        self._compl = QCompleter()
        self.tabPressed.connect(self.next_completion)

    def next_completion(self):
        index = self._compl.currentIndex()
        self._compl.popup().setCurrentIndex(index)
        start = self._compl.currentRow()
        if not self._compl.setCurrentRow(start + 1):
            self._compl.setCurrentRow(0)

    def event(self, event):
        if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Tab:
            self.tabPressed.emit()
            return True
        return super().event(event)

いくつかの調整/修正が必要になる場合がありますが、これが基本的な考え方です。

編集:

詳細については、

http://www.qtcentre.org/threads/23518-How-to-change-completion-rule-of-QCompleter

少し問題があります。Return キーを押すと、正しく動作しません。この問題の解決策は、上記のリンクまたは参照先のリソースで見つけることができます。今後数日でこれを修正し、この回答を更新します。

于 2015-03-11T00:09:58.920 に答える
1

おそらくもっと良い解決策がありますが、頭に浮かぶのは、フォーム上の他のすべてのウィジェットのフォーカス ポリシーを「タブ」フォーカスを含まないものに変更することです。タブ キーを使用しない唯一のオプションはQt::ClickFocusQt::NoFocusです。

于 2012-01-28T17:32:41.390 に答える