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

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

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

person c00kiemonster    schedule 30.10.2011    source источник
comment
QCompleter::setPopup(QAbstractItemView * всплывающее окно)   -  person Neel Basu    schedule 30.10.2011


Ответы (2)


  1. Чтобы ограничить количество строк: измените модель на QStringListModel, используя QCompleter.setModel и установите фиксированное количество элементов перед отображением всплывающего окна. . Также убедитесь, что параметр maxVisibleItems установлен правильно (по умолчанию семь). .
  2. Размер всплывающего окна должен измениться до нужной высоты автоматически. Ширина всплывающего окна может быть рассчитана путем сложения ширины полей (popup.width() - popup.viewport().width()), ширины фрейма (2 * popup.frameWidth()) и ширины самой длинной строки (popup.fontMetrics().boundingRect(string).width()).
  3. Положением (и шириной) всплывающего окна можно управлять, передав соответствующий QRect в QCompleter.complete.
  4. Форматом элементов списка можно управлять с помощью настройки делегата элемента. во всплывающем окне. См. этот ответ для примера делегата элемента форматированного текста. (Но обратите внимание, что это повлияет на то, как рассчитывается ширина всплывающего окна).
person ekhumoro    schedule 31.10.2011
comment
передача QRect методу complete работает при первом открытии, но как только текст изменяется и размер всплывающего окна изменяется, он возвращается в исходное положение. Есть ли способ сохранить смещение при редактировании текста? Я попытался создать подкласс списка и использовать перемещение в showEvent и resizeEvent, но, похоже, это не очень хорошо работает. - person Michael B; 08.10.2020

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

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

установить setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff)

person Neel Basu    schedule 30.10.2011
comment
Я попробовал maxVisibleItems, и я не знаю, проблема ли это в Mac, но он ведет себя не так, как я думал. Все, что он делает, это изменяет размер всплывающего окна (вроде как, это совсем не точно), поэтому вы можете видеть только, скажем, 5 элементов. Я бы ожидал изменения размера всплывающего окна и обрезки элементов всплывающего списка. - person c00kiemonster; 31.10.2011