GtkVBox Qt相当于

时间:2010-11-27 16:01:37

标签: c++ user-interface layout qt4

在GTK中,我曾经有一个窗口,我将gtk_container_add()用于GtkVBox。然后我可以将我想要的小部件打包到GtkVBox,让它们出现在窗口中。

现在我决定尝试Qt,但我似乎无法弄清楚如何在Qt中这样做。

现在我所做的就是创建一个QMainWindow,但我发现你只能打包一个主要的小部件,这显然是非常有限的。所以我想创建类似GtkVBox的东西,并将其用作主窗口小部件,然后将其他窗口小部件添加到此框中。

我通过Googling找到的只是Q3VBox小部件,这似乎是我想要的,但已被弃用,以及QVBoxLayout。

我尝试使用QVBoxLayout,但它告诉我我无法更改QMainWindow的布局,因为它已经有了布局。

编辑:我是这样做的(这是在构造函数中):

box = new QVBoxLayout;
setLayout(box)

编译很好,但在运行时,它会在控制台上打印: QWidget::setLayout: Attempting to set QLayout "" on HCGWindow "", which already has a layout (HCGWindow是我的应用程序窗口,它是QMainWindow的子类)

那么,如何在Qt中创建类似于GtkVBox的东西,如果解决方案是Q3VBox,为什么不推荐使用它以及我应该使用其他什么东西?

由于

2 个答案:

答案 0 :(得分:2)

实际上,这是Qt documentation提供的推荐解决方案。

您应该创建一个QVBoxLayout并在其中添加所需的小部件。之后,在另一个空窗口小部件上设置布局,然后将此窗口小部件设置为QMainWindow子类的中央窗口小部件。以下是代码中的示例:

QWidget* widget1 = new QWidget(); // This could be anything subclassing QWidget.
QWidget* widget2 = new QWidget();

QVBoxLayout* layout = new QVBoxLayout();
layout->addWidget(widget1);
layout->addWidget(widget2);

QWidget* central = new QWidget(); // Only a containing QWidget.
central->setLayout(layout);

this->setCentralWidget(central);

现在,你的QMainWindow子类应该有两个QWidgets,排列在QVBoxLayout中。

请注意,我没有向任何人提供任何父母。您可以这样做,但是当您调用addWidgetsetCentralWidget时,窗口小部件(和布局)的所有权将被赋予包含的类。

如果你读一下关于Qt的话,你就会知道这可以让父母在他即将被摧毁时摧毁他的孩子。

最后,请注意QMainWindow是一个例外,据我所知,它是唯一以setCentralWidget作为方法的类。如果您尝试创建QWidget子类,则可以使用setLayout(如上例所示)。

希望这有帮助。

答案 1 :(得分:0)

尝试创建QVBoxLayout实例,向其添加小部件并将此布局添加(不替换)到主窗口的布局。

注意,QLayout类没有成员addLayout,但子类有一个。

首先,你必须得到并记住主窗口布局的类名:

qDebug(this.layout()->objectName);

然后将QVBoxLayout添加到窗口的布局:

dynamic_cast<YourWindowLayoutClass>(
    this.layout())->addLayout(your_qvboxlayout_object);

我希望它能奏效。