我在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);
}
答案 0 :(得分:1)
布局设计为have control小部件的定位:
所有QWidget子类都可以使用布局来管理他们的孩子。 QWidget :: setLayout()函数将布局应用于窗口小部件。以这种方式在窗口小部件上设置布局时,它负责以下任务:
- 儿童小部件的定位。
- Windows的合理默认大小。
- 明智的窗户最小尺寸。
- 调整处理大小。
- 内容更改时自动更新:
- 字体大小,文字或其他内容 儿童小部件。
- 隐藏或显示子窗口小部件。
- 删除子小部件。
您应该阅读this文档,了解有关向布局添加小部件的信息:
- 所有小部件最初将根据其QWidget :: sizePolicy()和QWidget :: sizeHint()分配一定的空间。
- 如果任何窗口小部件设置了拉伸系数,且值大于零,则会根据拉伸系数按比例分配空间(如下所述)。
- 如果任何小部件的拉伸系数设置为零,则只有在没有其他小部件需要空间时才会获得更多空间。其中,空间首先分配给具有扩展大小策略的小部件。
- 分配的空间小于其最小大小的任何小部件(如果未指定最小大小,则为最小大小提示)将分配它们所需的最小大小。 (小部件不必具有最小尺寸或最小尺寸提示,在这种情况下,拉伸系数是它们的决定因素。)
- 分配了比最大大小更多空间的任何小部件都会分配它们所需的最大大小空间。 (小部件不必具有最大尺寸,在这种情况下,拉伸因子是它们的决定因素。)
醇>
我认为在布局中管理窗口小部件的最简单方法是在Qt Creator中使用设计模式,并为每个窗口小部件指定minimumSize
和/或maximumSize
,以及{{1 }}。通过这种方式,您可以看到会发生什么并尝试使用不同的值。
关于您收到的错误,请参阅documentation for setLayout()
:
如果此窗口小部件上已安装布局管理器,QWidget将不允许您安装另一个布局管理器。您必须首先删除现有布局管理器(由layout()返回),然后才能使用新布局调用setLayout()。
答案 1 :(得分:1)
QWidget :: setLayout:试图在QWidget上设置QLayout“” “tab_upload”,已有布局。
您在小部件上设置了新布局,该布局已包含之前点击“加号”按钮的布局。这个问题可以通过下一个方式解决:
"all"
但您不能直接为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
,并将QLineEdit
附加到现有布局。