Изменение размеров QListWidget в соответствии с его содержимым

У меня есть подкласс QListWidget, виджет содержит текстовые элементы в одном столбце и нескольких строках (обычный вид). Я хочу, чтобы виджет изменил размер до минимального размера, при котором текстовые элементы все еще будут видны. Я попытался использовать метод resize() с аргументом contentsSize(), это изменит размер виджета по высоте, чтобы он соответствовал текстовому содержимому, однако ширина останется прежней.

Вот фрагмент переопределенного метода, который я тестирую:

override void mousePressEvent(QMouseEvent event)
{
    this.resize(this.contentsSize());
}

Примечание. Это на языке D, и я использую библиотеку-оболочку QtD. Если я не делаю что-то не так, это может быть даже ошибка QtD (но я в этом сомневаюсь).


qt qt4 d
person Andrej Mitrović    schedule 18.01.2011    source источник
comment
Ответ, описанный в stackoverflow.com/questions/6337589/ может помочь.   -  person Vlado Klimovský    schedule 17.08.2011
comment
Спасибо, Владо. Теперь я печатаю более пятнадцати символов из-за глупого лимита переполнения стека. Какая приятная трата моего времени. В любом случае, еще раз спасибо!   -  person Andrej Mitrović    schedule 18.08.2011


Ответы (1)


Если вы готовы переключиться на QTableView или QTreeView, вы можете вызвать функцию resizeColumnsToContents() и изменить размер виджета на основе полученной ширины. В противном случае вам придется перебирать содержимое QListWidget и получать максимальную ширину элементов.

person Scott    schedule 18.01.2011
comment
Кажется, нет способа получить ширину QListWidgetItem. Свойство sizeHint() возвращает -1. Если только я не прибегну к ручному вычислению размера шрифта в пикселях * символов * и т. д. и т. д., что совсем не гибко. - person Andrej Mitrović; 19.01.2011
comment
Это вызов, и у меня нет правильного ответа на кончике языка — другими словами, может быть более правильное решение. Но хороший способ сделать это — использовать QTextLayout::boundingRect(). Другими словами, повторите свои элементы и примите шрифт по умолчанию (если нет, есть еще способы), настройте QTextLayout с текстом каждого элемента и вызовите boundingRect().width() для этого. - person Scott; 25.01.2011