タブを押したときに補完をしようとすると、すべての可能性が最初に完了します。QCompleterとTabキー
しかし、QWidget
ベースのメインウィンドウでは、タブを押すとQLineEdit
にフォーカスが失われ、その後に完了ポップアップが表示されなくなります。
修正する方法はありますか?
タブを押したときに補完をしようとすると、すべての可能性が最初に完了します。QCompleterとTabキー
しかし、QWidget
ベースのメインウィンドウでは、タブを押すとQLineEdit
にフォーカスが失われ、その後に完了ポップアップが表示されなくなります。
修正する方法はありますか?
おそらくもっと良い解決策がありますが、フォーム上の他のすべてのウィジェットのフォーカスポリシーをにしないようにすることは、「タブ」フォーカスを含むです。タブキーを使用しない唯一のオプションはQt::ClickFocus
とQt::NoFocus
です。
まだフォーカスがシフトされていませんが、Tabキーを押すと完了ダイアログがすぐに閉じます – daisy
QLineEdit
をサブクラス化し、キーpress eventを傍受しようとしましたか?
また、event filterを設定することもできます。
Whew。私はこの問題を解決しようとしましたが、いつも断念しました。今、私は答えを見つけるのに十分な掘り下げをしました。
OPですので、ここのコードはPythonですが、C++でも理解できるはずです。
基本的に、私が持っていた問題は「QCompleterのエントリを選択する方法」でした。私は前に気付かなかったが、答えはpopup()
メソッドにある。 QCompleterは、表示するものを含むモデルとビューで動作します。
希望するとおりに現在の行を変更し、モデル内のその行のインデックスを取得し、ポップアップでその行を選択することができます。
私のコードでは、QLineEdit
をサブクラス化し、tabPressed
シグナルを作成しました。これはTabを押すたびに出力されます。次に、この信号をこれと同じクラスのメソッドに接続します。
実装として、これは非常に簡単ですが、私の現在の目的ではこれで十分です。ここにスケルトンがあります(タブパーツの場合のみ、モデルやその他すべてが欠落しています)。
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)
いくつかのことを調整/修正する必要がありますが、これが基本的な考えです。
EDIT:リターンが押されたときに、物事が正常に動作しません。詳細については
は少し問題があります
http://www.qtcentre.org/threads/23518-How-to-change-completion-rule-of-QCompleter
を参照してください。おそらく、上記のリンクまたはその中の参照先のリソースで、この問題の解決策を見つけることができます。これを数日後に修正し、この回答を更新します。
これを解決しましたか?私は同じことを達成しようとしています:QLineEditのサブクラスを使用して、私はタブキーを傍受することができましたが、最初の利用可能な補完を強調表示することはまだ私のためには機能しません。 – AkiRoss
@AkiRoss決して行ったことはありませんが、QtCreatorのコードを見ることができます。ファイル選択ダイアログにタブの完成が表示される – daisy