2012-01-28 17 views
4

タブを押したときに補完をし​​ようとすると、すべての可能性が最初に完了します。QCompleterとTabキー

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

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

+0

これを解決しましたか?私は同じことを達成しようとしています:QLineEditのサブクラスを使用して、私はタブキーを傍受することができましたが、最初の利用可能な補完を強調表示することはまだ私のためには機能しません。 – AkiRoss

+1

@AkiRoss決して行ったことはありませんが、QtCreatorのコードを見ることができます。ファイル選択ダイアログにタブの完成が表示される – daisy

答えて

1

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

+0

まだフォーカスがシフトされていませんが、Tabキーを押すと完了ダイアログがすぐに閉じます – daisy

3

QLineEditをサブクラス化し、キーpress eventを傍受しようとしましたか?

また、event filterを設定することもできます。

0

Whew。私はこの問題を解決しようとしましたが、いつも断念しました。今、私は答えを見つけるのに十分な掘り下げをしました。

OPですので、ここのコードはPythonですが、C++でも理解できるはずです。

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

希望するとおりに現在の行を変更し、モデル内のその行のインデックスを取得し、ポップアップでその行を選択することができます。

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

  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) 

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

EDIT:リターンが押されたときに、物事が正常に動作しません。詳細については

は少し問題があります

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

を参照してください。おそらく、上記のリンクまたはその中の参照先のリソースで、この問題の解決策を見つけることができます。これを数日後に修正し、この回答を更新します。

関連する問題