简体   繁体   中英

Qt Desktop on Mac: QFormLayout sizing with subpanels

TL;DR: I'm having a grow/shrink probably using embedded forms inside a MainWindow. I'm unsure what to try next.

Okay, I have another sizing problem.

This is a sample app of what I'm trying to do:

示例应用程序

When I click on the various toolbar options, I intend to change the central widget contents accordingly. Maybe I should just use a tab widget, but I wanted to do it this way.

In the simplest form, with a widget layout like this:

主窗口小部件布局

I set the central widget's layout to Horizontal, and the Inner Widget to FormLayout then set the inner widget's expand rules to expand any expandable fields. As I resize the window, the simple line edit expands and contracts as desired.

When I click the bus icon in the toolbar, I swap out the contents of the central widget with a separate panel. That panel has a widget with a form layout, and is also set to expand and collapse. Here are the layout rules for the second panel:

V1Form布局

My trigger code does this:

currentCenter = ui->innerWidget; // In the constructor
currentCenter->hide();

if (v1Form == nullptr) {
    v1Form = new V1Form(ui->centralWidget);
}
v1Form->show();
currentCenter = v1Form;

I have tried various orders to this, and I tried using setCentralWidget(). In all cases, the new central area remains a fixed size, even though the original one expands and collapses.

What is working: I can readily change the inner contains for different forms. That's working great. (It took a while to figure it out.)

-or- I can make simple popup forms that grow and shrink properly.

What is not working is grow/shrink when I embed my form inside my central widget or if I use setCentralWidget.

I'm not sure what else to try.

Maybe I should just use a tab widget, but I wanted to do it this way.

You should definitely use a QTabWidget as your central widget. It is designed specifically for your use case, and it will greatly simplify your code.

My trigger code does this:

 currentCenter = ui->innerWidget; // In the constructor currentCenter->hide(); if (v1Form == nullptr) { v1Form = new V1Form(ui->centralWidget); } v1Form->show(); currentCenter = v1Form; 

With a QTabWidget , your trigger code can be simplified to:

ui->innerTabWidget->setIndex(1) .

You don't need to dynamically construct a V1Form. Simply use Qt Designer to create multiple pages in your QTabWidget and implement all your subpanel widgets within your MainWindow.ui .

(Nonetheless, if you want to implement each subpanel in its own separate *.ui file, you can still promote each page in your QTabWidget to your custom widget.)


What is not working is grow/shrink when I embed my form inside my central widget or if I use setCentralWidget.

To address your original symptoms: Your widgets don't grow/shrink because you didn't put them inside a layout that is part of your main window.

I found a solution doing it the way I started. I had to add one line of code:

void MainWindow::switchForm(QWidget *widget) {
    if (centralForm != widget) {
        if (centralForm != nullptr) {
            centralForm->hide();
            centralForm = nullptr;
        }
        if (widget != nullptr) {
            centralForm = widget;
            centralForm->show();
            ui->centralwidget->layout()->addWidget(centralForm);
        }
    }
}

void MainWindow::on_actionSetup_triggered()
{
    if (setupForm == nullptr) {
        setupForm = new SetupForm(ui->centralwidget);
    }
    switchForm(setupForm);
}

The missing line -- adding my new form to the layout:

ui->centralwidget->layout()->addWidget(centralForm);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM