7
votes

I am having a problem redrawing a QWidget window after its size has been adjusted. I have tried update(), repaint(), adjustSize(), but all seem to suffer from the same thing: only part of the window is redrawn, resulting in the window frame on the bottom and right sides to not show. The window is also not resized entirely.

Just in case it makes a difference, the window is in a QMdiArea.

Thanks.

        //  ... some subwidget resizing and moving.
        calibrationWindowUIs[activeWindow].layoutWidget2->move(QPoint(oldXLeft, 30 + height + 21));
        calibrationWindowUIs[activeWindow].layoutWidget1->move(QPoint(oldXRight, 30 + height + 21));

        //  Set window size.
        calibrationWindows[activeWindow]->setMinimumSize(calibrationWindowUIs[activeWindow].tabWidget->geometry().width() + 40, calibrationWindowUIs[activeWindow].tabWidget->geometry().height() + 40);
        calibrationWindows[activeWindow]->update();

Note: I'm new to Qt; perhaps I'm doing something wrong with layouts?

Edit: I may have not given enough information. Alright, to be quite honest, I still have to delve deeper into layouts and related material. What I had tried to do here was to use Qt Designer in order to design the window. I've done what perhaps amounts to a stupid mistake: I didn't use an overall parent layout for the entire window, but hacked it with a couple of smaller layouts that I therefore have to move about and resize individually. See the Qt Designer screen (the red rectangles are the sole layouts): calibrationWindow.

What is happening is that in the frame to the right, I am playing a video clip that can be of various resolutions. I want the frame to resize depending on this resolution, which also means that the buttons and window have to move/resize accordingly. That is where the window resize comes in. I'm sure there is a more elegant solution than what I am doing here, but I am trying to handle several other scenarios here and hence the lack of quality of code.

The result is that when I load a clip, the window attempts to resize, but does so badly; the following is the result: calibrationWindowB

If the window is dragged, it 'pops' into its correct size; in the meantime, however, it just looks ugly.

A couple further questions: do you use the Qt Designer to design your UIs? I found that programmatically you can achieve much better control of your interfaces. One thing which I could not do in the designer was to have a layout parented by the main widget, i.e. the equivalent of having the following bit of code:

QVBoxLayout* layout = new QVBoxLayout;
this->setLayout(layout);

A layout placed in the designer always seems to create this 'layoutWidget' subwidget, which the layout you placed is then parented to. Any way around that?

2
can you come up with a minimum code that doesn't work?Donotalo
just to be sure, you're sure that it's not a layout problem? As in, a widget just does not resize, instead of it being a drawing problem? A screenshot might perhaps help as well.Bart
It would be handy to see some of your code. It works for me.pokey909
Sorry, was away. Here are the last few lines of the code.Kristian D'Amato
still difficult to tell what might be going on. Please check that the width and height you are passing to setMinimumSize are correct and use try to use resize instead of update.pokey909

2 Answers

6
votes

We use a mix of designer and code to create layouts, the Qt layout system can be very unintuitive at times. But I would probably not layout a full series of tabs in one designer ui file, i would make each tab each own widget and then assemble them either through code or in the designer by promoting to custom classes. This gives you better separation of responsibilities, by putting all the functionality of all the tabs into one file you almost guarantee a large unwieldy class.

When a widget has child widgets in designer you can assign a layout to it by adding it from the context menu. Make sure nothing is selected and click on the background of the widget in which you want to create a layout, select the layout and all of the widgets children will be assigned the layout.

What does help is creating hierarchies of layouts. Looking at your first screenshot, i would probably use a vertical layout with spacers on top and bottom for the items on the right, an horizontal layout with spacers left and right for the button bar and a grid layout for all the items together. Without the spacers your items will extend when the window grows. The spacers will let you control the behavior under resizing better.

0
votes

you are calling setMinimumSize(). That's fine, but you should also call resize()