Как настроить всплывающее окно QCompleter в PyQt?

У меня есть несколько вещей для QCompleter QLineEdit, я заинтересован в настройке. Я хочу, чтобы он вел себя подобно строке адреса / поиска в Chrome.

  1. как я могу ограничить количество строк, которые отображаются? Например, даже если есть 15 матчей, я хочу, чтобы QCompleter показывал только 5.
  2. как изменить размер всплывающего окна? Например, я хочу сделать всплывающее окно приятным и уютным. Согласно приведенному выше примеру, я хочу, чтобы всплывающее окно изменяло размер до 5 рядов ровно без всяких показывая уродливые полосы прокрутки.
  3. как переместить всплывающее окно? Например, я хочу настроить вертикальное положение всплывающего окна так, чтобы оно было немного ниже родительского виджета.
  4. как я могу отформатировать элементы списка показанного всплывающего окна? Например, я хочу выделить часть слова, которая соответствует.

2 ответов


  1. чтобы ограничить количество строк: измените модель на a QStringListModel с помощью QCompleter.сетмоделя, и установите фиксированное количество элементов перед отображением всплывающего окна. Также убедитесь, что maxVisibleItems устанавливается соответствующим образом (по умолчанию семь).
  2. всплывающее окно должно изменить на правильный высота автоматически. The ширина всплывающего окна можно рассчитать, добавив вместе ширина поля (popup.width() - popup.viewport().width()), ширина рамки (2 * popup.frameWidth()) и ширина самой длинной строки (popup.fontMetrics().boundingRect(string).width()).
  3. позиционирование (и ширина) всплывающего окна можно контролировать путем передачи соответствующий QRect в QCompleter.полный.
  4. формат элементов списка может управляться настройка делегата элемента на всплывающем окне. См.ответ для примера делегата элемента с богатым текстом. (Но обратите внимание, что это повлияет на то, как ширина всплывающего окна рассчитывается).

хотя я никогда не пробовал то же самое в документации четко указано использовать maxVisibleItems(int maxItem) чтобы ограничить количество видимых элементов.

и как с настройкой всплывающего окна я вещь, которую вам нужно сделать подкласс QAbstractItemView и передайте его QCompleter::setPopup(QAbstractItemView * popup)

set setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff)