2012-01-28 97 views
4

我試圖做一個完成時,按下標籤,你得到了所有可能性的第一個完成。QCompleter和Tab鍵

但是,在基於QWidget的主窗口中,按下tab將使QLineEdit失去焦點,並在此之後隱藏完成彈出窗口。

有沒有辦法解決它?

+0

你解決了嗎?我試圖達到相同的目的:使用QLineEdit的子類我設法攔截tab鍵,但突出顯示第一個可用的完成仍然不適用於我。 – AkiRoss 2014-06-05 21:30:43

+1

@AkiRoss從未做過,但你可以看看QtCreator的代碼。文件選擇對話框似乎有製表符完成 – daisy 2014-06-06 00:21:12

回答

1

有可能是一個更好的解決方案,但想到的是將窗體上的所有其他窗口小部件的焦點政策更改爲不包括「標籤」焦點。唯一不使用Tab鍵的選項是Qt::ClickFocusQt::NoFocus

+0

仍有問題,焦點不再移動,但完成對話框按Tab鍵立即關閉 – daisy 2012-01-29 00:16:25

0

Whe。我花了一些時間來解決這個問題:)多次我試圖解決這個問題,但總是放棄。現在,我挖得足以找到答案。

請原諒,因爲這裏的代碼是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) 

您可能需要調整/修復幾件事情,但這是基本的想法。

編輯:

詳見

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

有一個小問題:按下返回時,這個事情不能正常工作。也許你可以在上面的鏈接或其中引用的資源中找到解決這個問題的方法。我會在接下來的幾天內解決這個問題並更新這個答案。