QCompleter и клавиша Tab

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

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

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


person daisy    schedule 28.01.2012    source источник
comment
Вы решили это? Я пытаюсь добиться того же: с помощью подкласса QLineEdit мне удалось перехватить клавишу табуляции, но выделение первого доступного завершения по-прежнему у меня не работает.   -  person AkiRoss    schedule 06.06.2014
comment
@AkiRoss Никогда не делал, но вы можете взглянуть на код QtCreator. Диалоговое окно выбора файла, кажется, имеет завершение табуляции   -  person daisy    schedule 06.06.2014


Ответы (3)


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

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

person TheThibz    schedule 22.03.2012

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

person Arnold Spence    schedule 28.01.2012
comment
Все еще есть проблемы, фокус больше не смещался, но диалоговое окно завершения закрывается сразу после нажатия клавиши Tab - person daisy; 29.01.2012

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

ОП, прошу прощения, потому что код здесь 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)

Возможно, вам придется настроить/исправить несколько вещей, но это основная идея.

РЕДАКТИРОВАТЬ:

Подробнее см.

http://www.qtcentre.org/threads/23518-How-to-change-completion-rule-of-QCompleter

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

person AkiRoss    schedule 11.03.2015