[Development] Feature request: several layouts in a single ui file

Olivier Goffart olivier at woboq.com
Fri Aug 30 15:49:45 CEST 2013


On Friday 30 August 2013 12:16:53 Yves Bailly wrote:
> Greetings all,
> 
> Following given advices, I post here a question posted in the forum...
> 
> I’m talking here about widgets-based applications, although it might be
> relevent too for qml-based applications. And posting in “general” because I
> think it’s truely “general”, despite being inspired by mobile (Android)
> development.
> 
> Here’s the point. More and more the computers which run our applications can
> self-adjust their display according to a “portrait” or “landscape”
> orientation – tablets and mid-end or high-end phones are actual computers.
> An application run in fullscreen should adjust itself, its layout,
> according to this orientation. On the desktop, one can also imagine an
> application adjusting its layout according to its main window form factor.
> 
> For example, an application can show a row of buttons at the top (or bottom)
> in a portrait layout, but a column of buttons at the left (or right) in a
> landscape layout.
> 
> However, when a GUI is designed in QtDesigner, only one layout can be
> defined. If the application has to adjust itself, this layout needs to be
> manually destroyed then re-created. It would be nice if it was optionally
> possible to define more than one layout in an UI file, then have the main
> container be allowed (optionally) to use one layout or the other according
> to e.g. an orientation change.
> 
> Maybe this could be achieved by splitting the generated setupUi() method.
> Something like this:
> 
>      class Ui_My_Widget
>      {
>        void setupUi(QWidget* My_Widget)
>        {
>           /* here create the various controls and set common properties */
>        }
>        void setupPortrait(QWidget* My_Widget)
>        {
>          /* apply a layout for portrait orientation */
>        }
>        void setupLandscape(QWidget* My_Widget)
>        {
>          /* apply a layout for landscape orientation */
>        }
> 
>        virtual bool hasOrientationLayouts() override
>        { return true; }
> 
>        virtual bool setupOrientationLayout(QWidget* My_Widget) override
>        {
>          if ( My_Widget->width() > My_Widget->height() )
>            this->setupLandscape();
>          else
>            this->setupPortrait();
>        }
>      };
> 
> The hasOrientationLayouts() method would override a virtual method provided
> in QWidget itself, which would return false by default. Then
> QWidget::resizeEvent() would call setupOrientationLayout() if
> hasOrientationLayouts() returns true. Of course setupOrientationLayout()
> would also be a virtual method in QWidget, doing nothing by default.
> 
> This way QtDesigner can provide two layouts an allows a GUI to automagically
> adjust itself, or this can be done “by hand” more easily.
> 
> Pushing the idea even further, some properties of some controls might be
> different according to the layout – e.g. some size policies. Or the size
> itself may induce some major changes, for example a small window (phone
> screen) may use tabs, while a large window (desktop or big tablet) may
> display everything in a single view.
> 
> Any thoughts?

Hi,

I think this is an ambitious proposal for QWidget based UI. 

I believe that QtQuick is already solving the problem quite elegantly with 
states.

As the focus is now more towards QtQuick UI, I doubt anyone is going to work 
on this idea.

-- 
Olivier

Woboq - Qt services and support - http://woboq.com - http://code.woboq.org




More information about the Development mailing list