QCompleter и Tab - PullRequest
       22

QCompleter и Tab

4 голосов
/ 28 января 2012

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

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

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

Ответы [ 3 ]

3 голосов
/ 22 марта 2012

Вы пытались создать подкласс QLineEdit и перехватить клавишу событие нажатия ?

В качестве альтернативы вы можете настроить фильтр событий .

1 голос
/ 28 января 2012

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

0 голосов
/ 11 марта 2015

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

OP, пожалуйста, простите меня, потому что код здесь - Python, но должен быть понятным и работать на C ++.

В принципе, проблемаУ меня было "как выбрать запись в QCompleter";Я не заметил раньше, но ответ в методе popup().QCompleter работает с моделью и представлением, которое содержит отображаемые объекты.

Вы можете изменить текущую строку по своему усмотрению, затем получить индекс этой строки в модели, а затем выбрать ее в всплывающем окне.up.

В моем коде я вложил в подкласс QLineEdit, создал сигнал tabPressed, который испускается при каждом нажатии клавиши Tab.Затем подключил этот сигнал к методу того же класса, который делает это:

  1. получить текущий индекс;
  2. выбрать индекс во всплывающем окне;
  3. 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, все работает неправильно.Может быть, вы можете найти решение этой проблемы по ссылке выше или в ссылочных ресурсах там.Я исправлю это в ближайшие несколько дней и обновлю этот ответ.

...