2014-12-08 2 views
1

У меня есть этот фрагмент кода:PySide: отформатированный текст в QComboBox

import PySide.QtGui 

app = PySide.QtGui.QApplication('') 
wnd = PySide.QtGui.QWidget() 
mly = PySide.QtGui.QVBoxLayout() 
combo = PySide.QtGui.QComboBox() 

table = [ ('Lorem','ipsum','dolor','sit','amet'), 
      ('Aliquam','sodales','nunc','eget','lorem'), 
      ('Vivamus','et','sapien','mattis','vulputate'), 
      ('Integer','ac','dolor','commodo','cursus'), 
      ('Sed','sed','erat','non','magna'), 
      ('Duis','vestibulum','eu','tortor','euismod') ] 

combo.clear() 
for (one,two,three,four,five) in table: 
    combo.addItem('%-12s | %-12s | %-12s | %-12s | %-12s' % (one,two,three,four,five)) 

mly.addWidget(combo) 
mly.addStretch(1) 
wnd.setLayout(mly) 
wnd.show() 
app.exec_() 

Я получил this (1) и я ищу что-то вроде (2): все столбцы табличным.

Комбобокс имеет стандартный пропорциональный шрифт (MS Shell Dlg 2 от QtDesigner). Я не хочу использовать моноширинный шрифт.

Я попытался вычислить максимальную ширину в пикселях каждого столбца с combo.fontMetrics().boundingRect(text).width() и заполнить каждый столбец с пробелами:

borde = ' ' 
unspc = ' ' 
maxwdt = {0:0, 1:0, 2:0, 3:0, 4:0} 
for lstlin in table: 
    for (ndx,val) in enumerate(lstlin): 
     unwdt = combo.fontMetrics().boundingRect(borde + val + borde).width() 
     if (unwdt > maxwdt[ndx]): 
      maxwdt[ndx] = unwdt 

combo.clear() 
for lstlin in table: 
    txtlin = '' 
    for (ndx,val) in enumerate(lstlin): 
     txtcmp = borde + val + borde 
     while (combo.fontMetrics().boundingRect(txtcmp).width() < maxwdt[ndx]): 
      txtcmp += unspc 
     txtlin += txtcmp + '|' 
    combo.addItem(txtlin) 

и я получил (3).

Существует какой-либо другой способ форматирования текста с пропорциональным шрифтом для использования в QComboBox ?. Благодарю.

ответ

1

Ваш алгоритм в порядке, но он может быть только точным, как ширина стандартного пространства в пропорциональном шрифте, который вы используете.

Чтобы получить более точные результаты, используйте максимально возможный whitespace character. Для шрифтов с хорошей поддержкой юникода это будет HAIR SPACE U+200A.

В Linux (используя шрифт DejaVu Sans) Я могу точно воспроизвести (3) изменяя следующие две строки в вашем примере сценария:

# hair-space 
unspc = '\u200a' 
borde = unspc * 10 
+0

прекрасно работает в Linux, Windows 7 и Windows 8. Не работает в Windows XP, потому что UTF8 не включен, но этого решения для меня достаточно. Благодаря!. – mangelo