Qt将几何设置为新创建的小部件

我在qt中有一个带有Tab Widget的MainWindow,其中包含一个名为“tab_upload”的选项卡 . 在这个标签上,我得到了一个带有“Genres”文本的标签(它是一个图书馆应用程序),附带一个“加号”按钮 . 我希望每次单击此按钮时都能获得新的QLineEdit,与其他按钮一致 . 获得正确的coordonates很容易,但我无法正确设置新QLineEdit的几何 . 我在setGeometry函数中键入的内容无关紧要,QLineEdit将始终显示在中心 . 而且,如果我第二次按下按钮,我会收到错误消息

QWidget :: setLayout:试图在QWidget“tab_upload”上设置QLayout“”,它已经有了布局 .

if(nr_genres < 4)
{
    QLineEdit *newgen = new QLineEdit(ui->tab_upload);
    int x = 5 + nr_genres * 90;
    newgen->setGeometry(x,187,90,25);
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(newgen);
    ui->tab_upload->setLayout(layout);
}

回答(2)

3 years ago

布局设计为小部件的定位have control

所有QWidget子类都可以使用布局来管理他们的孩子 . QWidget :: setLayout()函数将布局应用于窗口小部件 . 以这种方式在窗口小部件上设置布局时,它负责以下任务:子窗口小部件的定位 . Windows的合理默认大小 . 窗户的最小尺寸 . 调整处理大小 . 内容更改时自动更新:子窗口小部件的字体大小,文本或其他内容 . 隐藏或显示子窗口小部件 . 删除子小部件 .

有关向布局添加小部件的信息,请阅读this文档:

所有小部件最初将根据其QWidget :: sizePolicy()和QWidget :: sizeHint()分配一定量的空间 . 如果任何窗口小部件设置了拉伸因子,其值大于零,则它们将按其伸展因子的比例分配空间(如下所述) . 如果任何窗口小部件的拉伸因子设置为零,则只有在没有其他窗口小部件需要空间时才会获得更多空间 . 其中,空间首先分配给具有扩展大小策略的小部件 . 分配的空间小于其最小大小的小部件(如果未指定最小大小,则为最小大小提示)将分配它们所需的最小大小 . (小部件不必具有最小大小或最小大小提示,在这种情况下,伸展因子是它们的决定因素 . )分配了比其最大大小更多空间的任何小部件都被分配了它们所需的最大大小空间 . (小部件不必具有最大尺寸,在这种情况下,拉伸因子是它们的决定因素 . )

我认为在布局中管理小部件的最简单方法是在Qt Creator中使用设计模式,并为每个小部件指定 minimumSize 和/或 maximumSize ,以及 sizePolicy . 通过这种方式,您可以看到会发生什么并尝试使用不同的值 .

关于您收到的错误,在documentation for setLayout()中提到:

如果此窗口小部件上已安装布局管理器,QWidget将不允许您安装另一个布局管理器 . 您必须先删除现有布局管理器(由layout()返回),然后才能使用新布局调用setLayout() .

3 years ago

QWidget :: setLayout:试图在QWidget“tab_upload”上设置QLayout“”,它已经有了布局 .

您在小部件上设置了新布局,该小部件已包含之前单击“加号”按钮的布局 . 这个问题可以通过下一个方法解决:

QLineEdit *newgen = new QLineEdit(ui->tab_upload);
QVBoxLayout *layout = static_cast<QVBoxLayout*>(ui->tab_upload->layout());
if(!layout) {
    layout = new QVBoxLayout(ui->tab_upload);
    ui->tab_upload->setLayout(layout);
}
layout->addWidget(newgen);

但是您无法直接为 QLineEdit 设置几何体,因为几何体是由布局设置的 . 如果我理解了这个问题,这段代码必须帮到你 . 每次单击"plus"按钮后,它会创建新的 QLineEdit ,并将 QLineEdit 追加到现有布局 .