Фух. Мне потребовалось некоторое время, чтобы понять это :) Много раз я пытался решить эту проблему, но всегда сдавался. Теперь я копал достаточно, чтобы найти ответ.
ОП, прошу прощения, потому что код здесь 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)
Возможно, вам придется настроить/исправить несколько вещей, но это основная идея.
РЕДАКТИРОВАТЬ:
Подробнее см.
http://www.qtcentre.org/threads/23518-How-to-change-completion-rule-of-QCompleter
Есть небольшая проблема: когда нажимается Return, все работает неправильно. Возможно, вы сможете найти решение этой проблемы по приведенной выше ссылке или в упомянутых там ресурсах. Я исправлю это в ближайшие несколько дней и обновлю этот ответ.
person
AkiRoss
schedule
11.03.2015