タブを押したときに完了を作成しようとしています。すべての可能性の最初の完了が得られます。
しかし、QWidget
ベースのメイン ウィンドウでは、Tab キーを押すとQLineEdit
フォーカスが失われ、完了ポップアップはその後非表示になります。
それを修正する方法はありますか?
タブを押したときに完了を作成しようとしています。すべての可能性の最初の完了が得られます。
しかし、QWidget
ベースのメイン ウィンドウでは、Tab キーを押すとQLineEdit
フォーカスが失われ、完了ポップアップはその後非表示になります。
それを修正する方法はありますか?
キープレス イベントをサブクラス化QLineEdit
し、インターセプトしようとしましたか?
または、イベント フィルターを設定することもできます。
うわー。これを理解するのに少し時間がかかりました:)何度もこの問題を解決しようとしましたが、常にあきらめました。今、私は答えを見つけるのに十分掘り下げました。
OP、ご容赦ください。ここのコードは Python ですが、理解しやすく、C++ でも機能するはずです。
基本的に、私が抱えていた問題は「QCompleter でエントリを選択する方法」でした。今まで気がつきませんでしたが、答えはpopup()
メソッドにあります。QCompleter は、表示するものを含むモデルとビューで動作します。
必要に応じて現在の行を変更し、モデル内のその行のインデックスを取得して、ポップアップで選択できます。
私のコードでは、 をサブクラス化し、 Tab が押されるたびに発行されるシグナルをQLineEdit
作成しました。tabPressed
次に、このシグナルを、これを行う同じクラスのメソッドに接続します。
実装としては、これは非常に些細なことですが、私の現在の目的にはこれで十分です。これがスケルトンです(タブ部分だけで、モデルとその他すべてが欠落しています)。
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 キーを押すと、正しく動作しません。この問題の解決策は、上記のリンクまたは参照先のリソースで見つけることができます。今後数日でこれを修正し、この回答を更新します。
おそらくもっと良い解決策がありますが、頭に浮かぶのは、フォーム上の他のすべてのウィジェットのフォーカス ポリシーを「タブ」フォーカスを含まないものに変更することです。タブ キーを使用しない唯一のオプションはQt::ClickFocus
とQt::NoFocus
です。