在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,为什么不推荐使用它以及我应该使用其他什么东西?
由于
答案 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中。
请注意,我没有向任何人提供任何父母。您可以这样做,但是当您调用addWidget
或setCentralWidget
时,窗口小部件(和布局)的所有权将被赋予包含的类。
如果你读一下关于Qt的话,你就会知道这可以让父母在他即将被摧毁时摧毁他的孩子。
最后,请注意QMainWindow是一个例外,据我所知,它是唯一以setCentralWidget
作为方法的类。如果您尝试创建QWidget子类,则可以使用setLayout
(如上例所示)。
希望这有帮助。
答案 1 :(得分:0)
尝试创建QVBoxLayout实例,向其添加小部件并将此布局添加(不替换)到主窗口的布局。
注意,QLayout类没有成员addLayout,但子类有一个。
首先,你必须得到并记住主窗口布局的类名:
qDebug(this.layout()->objectName);
然后将QVBoxLayout添加到窗口的布局:
dynamic_cast<YourWindowLayoutClass>(
this.layout())->addLayout(your_qvboxlayout_object);
我希望它能奏效。