Whew. Мне потребовалось некоторое время, чтобы понять это. Несколько раз я пытался решить эту проблему, но всегда сдавался. Теперь я выкопал достаточно, чтобы найти ответ.
ОП, пожалуйста, извините меня, потому что здесь код 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
Там есть небольшая проблема: когда Return нажата, то не будет работать должным образом. Возможно, вы можете найти решение этой проблемы в ссылке выше или в ссылочных ресурсах. Я исправлю это в ближайшие несколько дней и обновить этот ответ.
Вы решили это?Я пытаюсь добиться того же: с помощью подкласса QLineEdit мне удалось перехватить ключ табуляции, но выделение первого доступного завершения по-прежнему не работает для меня. – AkiRoss
@AkiRoss Никогда не делал, но вы могли бы взглянуть на код QtCreator. Окно выбора файла похоже на завершение табуляции – daisy