Вобщем по маленьку идет изучение. Все получается. Не хватает, правда, чисто крестовых знаний, но это дело поправимое самой практикой.
У меня в QMainWindow которое одно главное, есть некоторое кол-во блоков, разделенных тематически: списки элементов, превью, рабочая зона и другие. Все эти блоки — QWidget.
Сейчас между блоками стоят сплиттеры, как вертикальные, так и горизонтальные. Сплиттеры с не нужными блоками можно схлопывать, тем самым скрывая их.
Однако, кроме схлопывания и изменения размеров блоков, мне хочется сделать их перемещение. Причем не только по своей «линии» между сплиттерами, но и в других «линиях».
Если парой слов — я хочу тайлинг с возможностью перемещать блоки в любую из четырех сторон, где остальные блоки автоматически освобождают место под перетаскиваемый. Кроме того, я хочу сохранить возможность сплиттинга меж любыми границами любых блоков (я понимаю что в некоторых местах могут углы мешать, но это все проверяется).
В данный момент сделано так, что при перетаскивании блока в горизонтальном сплиттере, если я тащу его горизонтально, то соседние блоки перескакивают освобождая место перетаскиваемому. А если тащу вертикально, и у этого сплиттера есть вышестоящий по иерархии блок внутри сплиттера, то тащу весь родительский уже вертикально вместе с остальными блоками рядом с тем за который цеплялась мышь.
Что мне тут не нравится? То что присутствует иерархия. Я бы хотел работать со всеми блоками на одном уровне.
Что я искал для решения этого вопроса?
1) mdi — интересный вариант и есть решения по автоподгону размеров внутренних окошек когда меняешь размер у одного. Но мне не нужны заголовочные полосы, я не хочу закрывать эти саб-окна, между ними нет сплиттера, а есть только бордюры и двухбордюрная дребедень меня никак не устраивает. Тут, даже если и возможно затюнить внешний вид, то это будет много всего указывать, переопределяя поверх стандартные поведения.
2) dock — отличный вариант, но... Доквиджеты могут располагаться только в четырех сторонах, т.е. центральная часть основного окна не будет доступна, ведь нам обязательно нужно указать centralWidget. Таким образом мы ограничиваем возможность перетащить какой-либо блок в центр. Централвиджет размером в ноль пикселей? Аха, я думал про такое, а как тогда три ряда делать? Тут получится только два.
3) велосипед — очень надеюсь, что к этому варианту прибегать не придется.
У меня сейчас уже шесть блоков, но будут еще, и это три горизонтальных ряда: один блок в 1 ряду, два блока во 2 ряду и три блока в 3 ряду. И я хочу дать возможность перетаскивать их и между рядов, т.е. чтобы легко можно было сделать четыре блока в 1 ряду и два ряда с одним блоком, например.
Очищеная от шелухи задача звучит так:
Вариант 1: сделать N не исчезающих горизонтальных зон, внутри которых и между которыми можно перетаскивать блоки. Последний оставшийся в зоне блок не может быть перетащен. Между блоками и зонами нужны сплиттеры, которые можно схлопывать, тем самым скрывая блок или зону блоков.
Вариант 2: сделать все блоки в одной зоне, где пользователь сам будет выбирать во сколько рядов и как будут расположены эти блоки. Между всеми блоками должны быть сплиттеры, которые можно схлопывать.
Так что же мне посоветует ЛОР? Может быть я плохо искал про первых два варианта? Или есть готовые решения а-ля плагины?