Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: andrew.k от Январь 28, 2011, 02:35



Название: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: andrew.k от Январь 28, 2011, 02:35
Подскажите, как расположить элементы в списке в несколько колонок.
QListWidget на сколько я понял не поддерживает колонки. Кути 4.

Что мне нужно.
У меня довольно много айтемов (порядка 60-70). Они checkable. Пользователь должен отметить необходимые. Если их расположить как обычно (в одну колонку), получится длинный список с полосой прокрутки, что очень неудобно и затрудняет поиск нужного элемента. Поэтому хотелось бы расположить их в списке так, чтобы они по возможности были видны все, либо как можно больше. Для этого хочу использовать колонки. Если элементы будут расположены в несколько колонок (3-4), то это будет удобно. Но как этого добиться в QTreeWidget я не понял.
И возможно ли вообще такое.
В свое время писал на VCL, там у списка была такая возможность. Просто задаешь количество колонок и элементы сами располагались в новой колонке, когда в текущей места больше нет. Соответственно при изменении размера списка, элементы пересортировывались, занимая свободное пространство.

Или может кто другой способ подскажет?

Хелп, пипл :)


Название: Re: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: andrew.k от Январь 28, 2011, 02:51
Нашел нечто похожее, но это не подходит, просто чтобы понять, что мне требуется.
В QListWidget свойство viewMode поставил в IconMode.
Элементы стали располагаться в несколько колонок. Но 1) длинные названия элементов листвиджет сокращает, оставляя в конце многоточие, это не подходит; 2) элементы можно свободно перетаскивать. это не нужно и нелепо выглядит.

Мне нужно как обычно сделано в диалоге выбора файлов, много имен в нескольких колонках и иконка рядом, а у меня вместо иконки чекбокс (как сделать чекбокс у элемента объяснять не нужно).

Так же я не понял, что делает свойство modelColumn.


Название: Re: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: Kolobok от Январь 28, 2011, 02:53
Посмотри эти методы QListView

setWrapping ( bool enable )
setFlow ( Flow flow )
setGridSize ( const QSize & size )


Название: Re: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: andrew.k от Январь 28, 2011, 03:02
Только что нашел, isWrapping.
Похоже это то, что нужно.
Сейчас посмотрю остальные.
GridSize уже смотрел. Не понял его назначения. Он уродует список :)


Название: Re: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: andrew.k от Январь 28, 2011, 03:04
понял с GridSize его нужно использовать совместно с wrapping, а то ерунда получается. :)
В любом случае размер у всех разный, поэтому задавать фиксированный не подходит.


Название: Re: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: andrew.k от Январь 28, 2011, 03:13
Спасибо колобок.
Осталось три вопроса.
1. Как запретить ему сокращать названия элементов? Так как элементы расположены очень плотно, то он сокращает текст (многоточие в конце). При чем не только у длинных. Даже у коротких.
2. Почему все элементы сбились в угол и не перемещаются с изменением размера списка. А так и сидят на месте.
3. Как задать количество колонок, например я хочу 2 или три строго. А он заполняет абы как, где место есть. В одной строке может оказаться 3 элемента в другой уже 2. Выглядит как хаос :)


Название: Re: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: andrew.k от Январь 28, 2011, 03:17
п.2 удалось починить играясь со свойствами. На сколько я понял layuotMode помог. Выставил Batched вместо SinglePass.

Теперь меня интересует только п.1


Название: Re: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: andrew.k от Январь 28, 2011, 03:30
Когда создаю элементы в дизайнере, то ничего не сокращается, текст показывается полностью независимо от длины.
А в итоге получается с многоточием на конце.
Где грабли?

Еще вопрос возник, как сделать, чтобы все айтемы были по умолчанию с чекбоксом?
Сейчас программно ставлю setCheckState( Unchecked ). Тогда появляется чекбокс.
Даже в дизайнере, чтобы появился чекбокс, нужно сначала поставить Checked, потом Unchecked.
Выглядит так, как будто из-за появившегося чекбокса, чуть-чуть текста не поместилось. Как раз 2-3 буквы.
Почему так? Нормально ли это?


Название: Re: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: andrew.k от Январь 28, 2011, 11:22
Вот скрин проблемы. Даже у коротких айтемов обрезаются две последних буквы. Почему?

 (http://imglink.ru/thumbnails/28-01-11/f1278dc0ff40384c6d1dd9eec1ba9aa7.jpg) (http://imglink.ru/show-image.php?id=67f48e8d74144bfd0763c878cd3bef69)


Название: Re: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: Kolobok от Январь 28, 2011, 11:43
1. Как запретить ему сокращать названия элементов? Так как элементы расположены очень плотно, то он сокращает текст (многоточие в конце). При чем не только у длинных. Даже у коротких.

Посмотри QAbstractItemView::setTextElideMode ( Qt::TextElideMode mode )

3. Как задать количество колонок

Может лучше взять QTableWidget

Еще вопрос возник, как сделать, чтобы все айтемы были по умолчанию с чекбоксом?

По умолчанию - нужно свою модель писать.


Название: Re: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: andrew.k от Январь 28, 2011, 14:19
1. Как запретить ему сокращать названия элементов? Так как элементы расположены очень плотно, то он сокращает текст (многоточие в конце). При чем не только у длинных. Даже у коротких.

Посмотри QAbstractItemView::setTextElideMode ( Qt::TextElideMode mode )
Этот параметр определяет положение многоточия. Можно выбрать ElideNone, тогда двоеточия не будет. А текст будет просто обрезаться на границе айтема.

Сейчас вот так выглядит.
 (http://imglink.ru/thumbnails/28-01-11/79c51251eee7680cd9edf5e12a1a9215.jpg) (http://imglink.ru/show-image.php?id=b3a27ca1813a3ca5e8381f0fe79df037)
Что ему мешает сделать колонки шире? тем более треть ширины пустует. Он их пытается распределить в три колонки. Зачем.
Хотя недавно было по-другому и не влезали только две буквы :)

3. Как задать количество колонок

Может лучше взять QTableWidget
Тогда мне придется в ручную расставлять айтемы по ячейкам, зачем мне такой гемор?
Мне это нужно просто для экономии места на экране.
Еще вопрос возник, как сделать, чтобы все айтемы были по умолчанию с чекбоксом?

По умолчанию - нужно свою модель писать.
Зачем же я буду городить модель из-за такой ерунды :)
Я о другом, у только что созданного айтема, если посмотреть флаги, установлен флаг UserCheckable, но чекбокса нет. Как так? И его никак не отобразить.
Он появляется только после того как я делаю item->setCheckState( Unchecked );
Хотя один раз у меня получилось как-то и айтемы создавались сразу с чекбоксом без дополнительных действий.


Название: Re: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: andrew.k от Январь 28, 2011, 14:59
Наконец-то удалось получить то, что нужно.
isWrapping true
resizeMode adjust
flowTopToBottom
layoutMode SinglePass
wordWrap false


Название: Re: Расположение колонками в списке (QListWidget или QTreeWidget)
Отправлено: andrew.k от Январь 28, 2011, 15:11
сейчас подумал, что удобнее сделать flow LeftTopRight
Но если ставлю LeftToRight получаю такую хрень.
Хотя до этого у меня получалось в две ровные колонки слева направо и вниз. Сейчас нет :)
Трындец с этим списком )

 (http://imglink.ru/thumbnails/28-01-11/b0d1bf34c701a9b1e4d2bf504633f6e6.jpg) (http://imglink.ru/show-image.php?id=445d7c57a9cbe78f56cd3c267b2a70ee)