Уф.Мне потребовалось некоторое время, чтобы понять это :) Несколько раз я пытался решить эту проблему, но всегда сдавался.Теперь, я выкопал достаточно, чтобы найти ответ.
OP, пожалуйста, простите меня, потому что код здесь - Python, но должен быть понятным и работать на C ++.
В принципе, проблемаУ меня было "как выбрать запись в QCompleter";Я не заметил раньше, но ответ в методе popup()
.QCompleter работает с моделью и представлением, которое содержит отображаемые объекты.
Вы можете изменить текущую строку по своему усмотрению, затем получить индекс этой строки в модели, а затем выбрать ее в всплывающем окне.up.
В моем коде я вложил в подкласс QLineEdit
, создал сигнал tabPressed
, который испускается при каждом нажатии клавиши Tab.Затем подключил этот сигнал к методу того же класса, который делает это:
- получить текущий индекс;
- выбрать индекс во всплывающем окне;
- advanceк следующей строке.
В качестве реализации это очень тривиально, но для моей текущей цели этого достаточно.Вот скелет (только для вкладки, здесь не хватает модели и всего остального).
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
Есть небольшая проблема: когда нажата клавиша Return, все работает неправильно.Может быть, вы можете найти решение этой проблемы по ссылке выше или в ссылочных ресурсах там.Я исправлю это в ближайшие несколько дней и обновлю этот ответ.