Mac上的Qt Desktop:使用子面板调整QFormLayout的大小

时间:2019-05-20 19:19:10

标签: c++ qt

TL; DR:我正在使用MainWindow内的嵌入式表单进行缩放。我不确定下一步该怎么做。

好的,我还有另一个尺码问题。

这是我正在尝试做的一个示例应用程序:

Sample App

当我单击各种工具栏选项时,我打算相应地更改中央小部件的内容。也许我应该只使用选项卡小部件,但我想这样做。

以最简单的形式,具有这样的小部件布局:

Main Window Widget Layout

我将中央窗口小部件的布局设置为“水平”,然后将“内部窗口小部件”设置为FormLayout,然后将内部窗口小部件的扩展规则设置为可扩展任何可扩展字段。当我调整窗口大小时,简单的行编辑会根据需要扩展和收缩。

当我单击工具栏中的总线图标时,会用一个单独的面板换出中央窗口小部件的内容。该面板具有一个具有表单布局的小部件,并且还设置为展开和折叠。以下是第二个面板的布局规则:

V1Form Layout

我的触发代码执行此操作:

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

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

我为此尝试了各种命令,并尝试使用setCentralWidget()。在所有情况下,即使原来的中心区域扩展和折叠,新的中心区域仍保持固定大小。

有效的方法:我可以很容易地将内部包含更改为不同的形式。很好(花了一段时间才弄清楚。)

-或者-我可以制作简单的弹出表单,以适当地增长和收缩。

当我将表单嵌入到中央窗口小部件中或使用setCentralWidget时,无法正常工作是增长/收缩。

我不确定还能尝试什么。

2 个答案:

答案 0 :(得分:0)

  

也许我应该只使用选项卡小部件,但是我想这样做。

您绝对应该使用QTabWidget作为中央窗口小部件。它是专门为您的用例设计的,它将大大简化您的代码。

  

我的触发代码执行此操作:

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

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

使用QTabWidget,您的触发代码可以简化为:

ui->innerTabWidget->setIndex(1)

您不需要动态构造V1Form。只需使用Qt Designer在QTabWidget中创建多个页面,并在MainWindow.ui中实现所有子面板小部件即可。

(尽管如此,如果您想在各自的* .ui文件中实现每个子面板,您仍然可以promote QTabWidget中的每个页面到自定义窗口小部件。)


  

当我将表单嵌入到中央窗口小部件中或使用setCentralWidget时,无法正常工作是增长/收缩。

要解决您的原始症状:小部件不会增长/缩小,因为您没有将其放在主窗口一部分的布局中。

答案 1 :(得分:0)

我找到了一种解决方法,可以从开始就做。我必须添加一行代码:

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);
}

缺少的行-将我的新表单添加到布局中

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