LINUX.ORG.RU

Сложный GUI на Qt часть вторая

 , ,


0

5

Вобщем по маленьку идет изучение. Все получается. Не хватает, правда, чисто крестовых знаний, но это дело поправимое самой практикой.

У меня в QMainWindow которое одно главное, есть некоторое кол-во блоков, разделенных тематически: списки элементов, превью, рабочая зона и другие. Все эти блоки — QWidget.

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

Однако, кроме схлопывания и изменения размеров блоков, мне хочется сделать их перемещение. Причем не только по своей «линии» между сплиттерами, но и в других «линиях».

Если парой слов — я хочу тайлинг с возможностью перемещать блоки в любую из четырех сторон, где остальные блоки автоматически освобождают место под перетаскиваемый. Кроме того, я хочу сохранить возможность сплиттинга меж любыми границами любых блоков (я понимаю что в некоторых местах могут углы мешать, но это все проверяется).

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

Что мне тут не нравится? То что присутствует иерархия. Я бы хотел работать со всеми блоками на одном уровне.

Что я искал для решения этого вопроса?

1) mdi — интересный вариант и есть решения по автоподгону размеров внутренних окошек когда меняешь размер у одного. Но мне не нужны заголовочные полосы, я не хочу закрывать эти саб-окна, между ними нет сплиттера, а есть только бордюры и двухбордюрная дребедень меня никак не устраивает. Тут, даже если и возможно затюнить внешний вид, то это будет много всего указывать, переопределяя поверх стандартные поведения.

2) dock — отличный вариант, но... Доквиджеты могут располагаться только в четырех сторонах, т.е. центральная часть основного окна не будет доступна, ведь нам обязательно нужно указать centralWidget. Таким образом мы ограничиваем возможность перетащить какой-либо блок в центр. Централвиджет размером в ноль пикселей? Аха, я думал про такое, а как тогда три ряда делать? Тут получится только два.

3) велосипед — очень надеюсь, что к этому варианту прибегать не придется.

У меня сейчас уже шесть блоков, но будут еще, и это три горизонтальных ряда: один блок в 1 ряду, два блока во 2 ряду и три блока в 3 ряду. И я хочу дать возможность перетаскивать их и между рядов, т.е. чтобы легко можно было сделать четыре блока в 1 ряду и два ряда с одним блоком, например.

Очищеная от шелухи задача звучит так:

Вариант 1: сделать N не исчезающих горизонтальных зон, внутри которых и между которыми можно перетаскивать блоки. Последний оставшийся в зоне блок не может быть перетащен. Между блоками и зонами нужны сплиттеры, которые можно схлопывать, тем самым скрывая блок или зону блоков.

Вариант 2: сделать все блоки в одной зоне, где пользователь сам будет выбирать во сколько рядов и как будут расположены эти блоки. Между всеми блоками должны быть сплиттеры, которые можно схлопывать.

Так что же мне посоветует ЛОР? Может быть я плохо искал про первых два варианта? Или есть готовые решения а-ля плагины?

лучше бы скрин/мокап выложил, чем простыню писать

dib2 ★★★★★ ()

Так что же мне посоветует ЛОР?

На HTML/JS/CSS этот эффект сделал бы за день (а погуглив ушло бы пара часов на поиск и опробование готового решения) и перешел бы к следующей задаче.

foror ★★★★ ()
Последнее исправление: foror (всего исправлений: 3)
Ответ на: комментарий от deep-purple

Я бы сам с удовольствием, но пока нет вменяемого окружения для релиза приложения на HTML/JS/CSS.

foror ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.