2012-01-28 4 views
4

Я пытаюсь выполнить завершение при нажатии вкладки, вы получаете первое завершение всех возможностей.QCompleter и клавиша Tab

Но, в главном окне QWidget, нажатие на вкладку сделает QLineEdit утраченным фокусом, а затем завершение всплывающего окна.

Есть ли способ исправить это?

+0

Вы решили это?Я пытаюсь добиться того же: с помощью подкласса QLineEdit мне удалось перехватить ключ табуляции, но выделение первого доступного завершения по-прежнему не работает для меня. – AkiRoss

+1

@AkiRoss Никогда не делал, но вы могли бы взглянуть на код QtCreator. Окно выбора файла похоже на завершение табуляции – daisy

ответ

1

Возможно, это лучшее решение, но на ум приходит изменение политики фокуса для всех других виджетов формы в то, что не включает фокус «вкладки». Единственными опциями, которые не используют клавишу табуляции, являются Qt::ClickFocus и Qt::NoFocus.

+0

Все еще есть проблемы, фокус больше не сдвигался, но диалог завершения закрывается сразу при нажатии клавиши Tab – daisy

3

Вы пробовали подкласс QLineEdit и перехватили ключ press event?

В качестве альтернативы вы можете установить event filter.

0

Whew. Мне потребовалось некоторое время, чтобы понять это. Несколько раз я пытался решить эту проблему, но всегда сдавался. Теперь я выкопал достаточно, чтобы найти ответ.

ОП, пожалуйста, извините меня, потому что здесь код 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

Там есть небольшая проблема: когда Return нажата, то не будет работать должным образом. Возможно, вы можете найти решение этой проблемы в ссылке выше или в ссылочных ресурсах. Я исправлю это в ближайшие несколько дней и обновить этот ответ.

Смежные вопросы