Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GtkVBox Qt等效物_C++_User Interface_Layout_Qt4 - Fatal编程技术网

C++ GtkVBox Qt等效物

C++ GtkVBox Qt等效物,c++,user-interface,layout,qt4,C++,User Interface,Layout,Qt4,在GTK中,我曾经有一个窗口,我在其中添加了一个GtkVBox。然后,我可以将我想要的小部件打包到GtkVBox,让它们显示在窗口中 现在我决定试用Qt,但我似乎不知道如何在Qt中实现这一点 现在我所做的是创建一个QMainWindow,但我发现您只能将一个主窗口小部件打包到其中,这显然是非常有限的。所以我想创建一些类似GtkVBox的东西,并将其用作主小部件,然后将其他小部件添加到此框中 然而,通过谷歌搜索,我发现只有Q3VBox小部件(这似乎是我想要的,但已被弃用)和QVBoxLayout

在GTK中,我曾经有一个窗口,我在其中添加了一个GtkVBox。然后,我可以将我想要的小部件打包到GtkVBox,让它们显示在窗口中

现在我决定试用Qt,但我似乎不知道如何在Qt中实现这一点

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

然而,通过谷歌搜索,我发现只有Q3VBox小部件(这似乎是我想要的,但已被弃用)和QVBoxLayout

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

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

它可以很好地编译,但在运行时,它会在控制台上打印:
QWidget::setLayout:尝试在已具有布局的HCGWindow“”上设置QLayout“”
(HCGWindow是我的应用程序窗口,它是QMainWindow的子类)

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


感谢

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

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

首先,您必须获取并记住主窗口布局的类名:

qDebug(this.layout()->objectName);
dynamic_cast<YourWindowLayoutClass>(
    this.layout())->addLayout(your_qvboxlayout_object);
然后将QVBoxLayout添加到窗口布局:

qDebug(this.layout()->objectName);
dynamic_cast<YourWindowLayoutClass>(
    this.layout())->addLayout(your_qvboxlayout_object);
dynamic\u cast(
this.layout())->addLayout(您的对象);

我希望它能起作用。

事实上,以下是由提供的建议解决方案

您应该创建一个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子类应该包含两个QWidget,它们以QVBoxLayout的形式排列

请注意,我没有给任何人任何父母。您本来可以这样做,但是当您调用
addWidget
setCentralWidget
时,小部件(和布局)的所有权将被赋予包含的类

如果你读了一点关于Qt的内容,你就会知道这允许父母在自己即将被毁灭的时候毁灭他的孩子

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


希望这有帮助。

如何更改主窗口的布局?显示编译器打印的错误。@werehuman:已编辑的问题,它在运行时显示错误,而不是编译。谢谢!我在看了弃用说明后也发现了这一点,我就是这么用的。