Russian Qt Forum
Ноябрь 24, 2024, 06:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Расположение колонками в списке (QListWidget или QTreeWidget)  (Прочитано 10979 раз)
andrew.k
Гость
« : Январь 28, 2011, 02:35 »

Подскажите, как расположить элементы в списке в несколько колонок.
QListWidget на сколько я понял не поддерживает колонки. Кути 4.

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

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

Хелп, пипл Улыбающийся
Записан
andrew.k
Гость
« Ответ #1 : Январь 28, 2011, 02:51 »

Нашел нечто похожее, но это не подходит, просто чтобы понять, что мне требуется.
В QListWidget свойство viewMode поставил в IconMode.
Элементы стали располагаться в несколько колонок. Но 1) длинные названия элементов листвиджет сокращает, оставляя в конце многоточие, это не подходит; 2) элементы можно свободно перетаскивать. это не нужно и нелепо выглядит.

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

Так же я не понял, что делает свойство modelColumn.
Записан
Kolobok
Гость
« Ответ #2 : Январь 28, 2011, 02:53 »

Посмотри эти методы QListView

setWrapping ( bool enable )
setFlow ( Flow flow )
setGridSize ( const QSize & size )
Записан
andrew.k
Гость
« Ответ #3 : Январь 28, 2011, 03:02 »

Только что нашел, isWrapping.
Похоже это то, что нужно.
Сейчас посмотрю остальные.
GridSize уже смотрел. Не понял его назначения. Он уродует список Улыбающийся
Записан
andrew.k
Гость
« Ответ #4 : Январь 28, 2011, 03:04 »

понял с GridSize его нужно использовать совместно с wrapping, а то ерунда получается. Улыбающийся
В любом случае размер у всех разный, поэтому задавать фиксированный не подходит.
Записан
andrew.k
Гость
« Ответ #5 : Январь 28, 2011, 03:13 »

Спасибо колобок.
Осталось три вопроса.
1. Как запретить ему сокращать названия элементов? Так как элементы расположены очень плотно, то он сокращает текст (многоточие в конце). При чем не только у длинных. Даже у коротких.
2. Почему все элементы сбились в угол и не перемещаются с изменением размера списка. А так и сидят на месте.
3. Как задать количество колонок, например я хочу 2 или три строго. А он заполняет абы как, где место есть. В одной строке может оказаться 3 элемента в другой уже 2. Выглядит как хаос Улыбающийся
Записан
andrew.k
Гость
« Ответ #6 : Январь 28, 2011, 03:17 »

п.2 удалось починить играясь со свойствами. На сколько я понял layuotMode помог. Выставил Batched вместо SinglePass.

Теперь меня интересует только п.1
« Последнее редактирование: Январь 28, 2011, 03:20 от andrew.k » Записан
andrew.k
Гость
« Ответ #7 : Январь 28, 2011, 03:30 »

Когда создаю элементы в дизайнере, то ничего не сокращается, текст показывается полностью независимо от длины.
А в итоге получается с многоточием на конце.
Где грабли?

Еще вопрос возник, как сделать, чтобы все айтемы были по умолчанию с чекбоксом?
Сейчас программно ставлю setCheckState( Unchecked ). Тогда появляется чекбокс.
Даже в дизайнере, чтобы появился чекбокс, нужно сначала поставить Checked, потом Unchecked.
Выглядит так, как будто из-за появившегося чекбокса, чуть-чуть текста не поместилось. Как раз 2-3 буквы.
Почему так? Нормально ли это?
« Последнее редактирование: Январь 28, 2011, 03:34 от andrew.k » Записан
andrew.k
Гость
« Ответ #8 : Январь 28, 2011, 11:22 »

Вот скрин проблемы. Даже у коротких айтемов обрезаются две последних буквы. Почему?


Записан
Kolobok
Гость
« Ответ #9 : Январь 28, 2011, 11:43 »

1. Как запретить ему сокращать названия элементов? Так как элементы расположены очень плотно, то он сокращает текст (многоточие в конце). При чем не только у длинных. Даже у коротких.

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

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

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

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

По умолчанию - нужно свою модель писать.
Записан
andrew.k
Гость
« Ответ #10 : Январь 28, 2011, 14:19 »

1. Как запретить ему сокращать названия элементов? Так как элементы расположены очень плотно, то он сокращает текст (многоточие в конце). При чем не только у длинных. Даже у коротких.

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

Сейчас вот так выглядит.

Что ему мешает сделать колонки шире? тем более треть ширины пустует. Он их пытается распределить в три колонки. Зачем.
Хотя недавно было по-другому и не влезали только две буквы Улыбающийся

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

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

По умолчанию - нужно свою модель писать.
Зачем же я буду городить модель из-за такой ерунды Улыбающийся
Я о другом, у только что созданного айтема, если посмотреть флаги, установлен флаг UserCheckable, но чекбокса нет. Как так? И его никак не отобразить.
Он появляется только после того как я делаю item->setCheckState( Unchecked );
Хотя один раз у меня получилось как-то и айтемы создавались сразу с чекбоксом без дополнительных действий.
« Последнее редактирование: Январь 28, 2011, 14:26 от andrew.k » Записан
andrew.k
Гость
« Ответ #11 : Январь 28, 2011, 14:59 »

Наконец-то удалось получить то, что нужно.
isWrapping true
resizeMode adjust
flowTopToBottom
layoutMode SinglePass
wordWrap false
Записан
andrew.k
Гость
« Ответ #12 : Январь 28, 2011, 15:11 »

сейчас подумал, что удобнее сделать flow LeftTopRight
Но если ставлю LeftToRight получаю такую хрень.
Хотя до этого у меня получалось в две ровные колонки слева направо и вниз. Сейчас нет Улыбающийся
Трындец с этим списком )

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 20.