Как мога да персонализирам изскачащия прозорец на 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) за ограничаване на броя на видимите елементи.

и както при персонализирането на PopUp Window I, трябва да направите подклас на QAbstractItemView и го предайте на QCompleter::setPopup(QAbstractItemView * popup)

задайте setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff)

person Neel Basu    schedule 30.10.2011
comment
Опитах maxVisibleItems и не знам дали е проблем с Mac, но не се държи така, както си мислех. Всичко, което прави, е преоразмеряване на изскачащия прозорец (донякъде, изобщо не е точно), така че можете да видите само да кажем 5 елемента. Бих очаквал преоразмеряване на изскачащ прозорец и също изрязване в елементите на изскачащия списък. - person c00kiemonster; 31.10.2011