[Development] New class for QtWidgets: ColumnResizer
André Somers
andre at familiesomers.nl
Fri Jun 13 10:32:02 CEST 2014
Ziller Eike schreef op 13-6-2014 09:51:
> On Jun 12, 2014, at 6:51 PM, Oswald Buddenhagen <oswald.buddenhagen at digia.com> wrote:
>
>> On Thu, Jun 12, 2014 at 04:08:17PM +0200, Aurélien Gâteau wrote:
>>> Olivier Goffart wrote:
>>>> But just wondering if it would not be better to have that as an API within
>>>> QGridLayout such as
>>>> QGridLayout::setAlignedWith(QGridLayout*)
>>> The class works with QFormLayout as well, so I don't think moving the
>>> feature into QGridLayout would be a good idea.
>>>
>> they have a common base class, you know ...
>>
>> QLayout::linkDimension(QLayout *other, Qt::Orientation orientation = Qt::Horizontal)
>>
>> (the second parameter is actually a flag field).
>>
>> and for more fine-grained control one could consider (not sure this makes
>> sense):
>>
>> QLayoutItem::linkDimension(QLayoutItem *other, Qt::Orientation orientation = Qt::Horizontal)
>>
>> but then, i wonder whether you are fixing the right problem to start
>> with. usually, one would create a big master layout, and embed
>> sublayouts spanning multiple cells in the areas that are not supposed to
>> be contrained by the grid.
> In principle I like the idea of being able to work with a “master” grid. That’s something I wished e.g. for Qt Creator’s preferences dialog, where we use group boxes to group options, and these contain either something like what form layout does, or lists of checkboxes etc, or a mix.
> Currently it is basically impossible to align the content in the vertically layouted group boxes.
>
Indeed, and that's exactly what ColumnResizer addresses. Putting
everything in one big layout works only for small, simple widgets. As
soon as you start using widgets that contain other widgets (like group
boxes, but also tab pages or just compound widgets) you're out of luck
with what we currently have in Qt. I have used ColumnResizer
successfully to work around these limitations in the past.
Ideally (to me), it would be possible to indeed have a single master
grid for a window (or a subsection thereof), and be able to somehow
'attach' other layouts inside containers widgets to this master grid, so
the local layout would mirror (a part of) the master grid, and the
master grid would be sized such that it takes into account these
attached child grids.
So, more something like this:
//modeled after addWidget
QGridLayout::linkToParentLayout(QGridLayout *masterGrid, int fromRow,
int fromColumn, int rowSpan, intColumnSpan);
Other layout types would get similar methods:
//a hbox is a single row by definition
QHBoxLayout::linkToParentLayout(QGridLayout *masterGrid, int row, int
fromColumn, int columnSpan);
//a vbox is a single column by definition
QVBoxLayout::linkToParentLayout(QGridLayout *masterGrid, int fromRow,
int column, int rowSpan);
//a form layout is just a two-column layout
QFormLayout::linkToParentLayout(QGridLayout *masterGrid, int fromRow,
int fromColumn, int rowSpan); //columnSpan == 2 by definition
A downside to such an approach is of course that it takes more effort to
think about the layout of the form, as you need to take all its
containers into account as well. The margins of the container itself has
will need additional rows and columns in such a master grid then. Also,
adding items in one container may then influence the layout in another
container. That could get quite complicated to work with. ColumnResizer
is simpler in that sense.
André
More information about the Development
mailing list