Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++ Qt:家长如何影响子部件的布局?_C++_Qt_Opengl_User Interface - Fatal编程技术网

C++ Qt:家长如何影响子部件的布局?

C++ Qt:家长如何影响子部件的布局?,c++,qt,opengl,user-interface,C++,Qt,Opengl,User Interface,我一直试图学习Qt,目的是在我的OpenGL项目上嵌入GUI。在本例中,想法是让我的OpenGL视口填充我的主窗口。我有一个简单的基于QtWidget的GUI,其中包含一个“RenderSurface”,它是QGLWidget的一个子类。但是,我注意到,将RenderSurface作为主窗口的子窗口会对GUI的布局产生不必要的影响 以下是简单的主窗口代码和屏幕截图,无需使用家长: #include "mainwindow.h" #include "rendersurface.h" MainW

我一直试图学习Qt,目的是在我的OpenGL项目上嵌入GUI。在本例中,想法是让我的OpenGL视口填充我的主窗口。我有一个简单的基于QtWidget的GUI,其中包含一个“RenderSurface”,它是QGLWidget的一个子类。但是,我注意到,将RenderSurface作为主窗口的子窗口会对GUI的布局产生不必要的影响


以下是简单的主窗口代码和屏幕截图,无需使用家长:

#include "mainwindow.h"
#include "rendersurface.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    renderSurface()
{
    setCentralWidget(&renderSurface);

    setWindowTitle("QtGL Test");
}

MainWindow::~MainWindow()
{
}
#include "mainwindow.h"
#include "rendersurface.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    renderSurface(this)
{
    setCentralWidget(&renderSurface);

    setWindowTitle("QtGL Test");
}

MainWindow::~MainWindow()
{
}

在这种情况下,当我在MainWindow初始化列表中调用其构造函数时,我的RenderSurface(QGLWidget子类)没有被传递到任何父QWidget的指针。您可以看到,深灰色的OpenGL上下文适合窗口的大小,即使在我扩展和收缩窗口大小时,它似乎也会填充窗口

育儿也是这样:

#include "mainwindow.h"
#include "rendersurface.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    renderSurface()
{
    setCentralWidget(&renderSurface);

    setWindowTitle("QtGL Test");
}

MainWindow::~MainWindow()
{
}
#include "mainwindow.h"
#include "rendersurface.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    renderSurface(this)
{
    setCentralWidget(&renderSurface);

    setWindowTitle("QtGL Test");
}

MainWindow::~MainWindow()
{
}

只需将“this”传递给RenderSurface构造函数,即可更改OpenGL上下文最初在窗口中呈现的方式。还值得注意的是,一旦我通过拖动边来调整窗口大小,我的RenderSurface将开始正确填充窗口


为什么使我的RenderSurface成为我主窗口的子窗口会导致此问题?我怎样才能避免这种看起来像马车的行为?另外,由于我的GUI似乎在没有父对象的情况下工作得更好,那么在Qt中对象父对象的优点和缺点是什么?

  • 案例1:您正在有效地使用QMainWindow布局,这是一个特定的布局实现,与QGridLayout或QStackedLayout的程度相同
  • 案例2:您使用的是默认的Qt小部件布局,它的子小部件设置更为宽松。我知道的唯一条件是子矩形位于父矩形内,其默认位置为0,0。布局不会调整子项的大小
setCentralWidget(&renderSurface)将尝试将renderSurface添加到Qmainwindow布局中。在案例2中,rendersurface已经在布局中,因此此尝试将失败

Also, since my GUI seems to work better without parenting
你对育儿部分的看法是错误的。在这两种情况下,
renderSurface
都成为窗口的子级

QWidget* w = new Qwidget(0);
QLayout* l = new QHBoxLayout();

l->add(w);
setLayout(l);
在setLayout期间,布局中的所有小部件都将其关联性更改为拥有布局的小部件
w
不再是一个无父窗口小部件

当一个小部件要被添加到一个布局中时,最好的方法是在没有父部件的情况下创建它。稍后将设置正确的父级。

  • 案例1:您正在有效地使用QMainWindow布局,这是一个特定的布局实现,与QGridLayout或QStackedLayout的程度相同
  • 案例2:您使用的是默认的Qt小部件布局,它的子小部件设置更为宽松。我知道的唯一条件是子矩形位于父矩形内,其默认位置为0,0。布局不会调整子项的大小
setCentralWidget(&renderSurface)将尝试将renderSurface添加到Qmainwindow布局中。在案例2中,rendersurface已经在布局中,因此此尝试将失败

Also, since my GUI seems to work better without parenting
你对育儿部分的看法是错误的。在这两种情况下,
renderSurface
都成为窗口的子级

QWidget* w = new Qwidget(0);
QLayout* l = new QHBoxLayout();

l->add(w);
setLayout(l);
在setLayout期间,布局中的所有小部件都将其关联性更改为拥有布局的小部件
w
不再是一个无父窗口小部件

当一个小部件要被添加到一个布局中时,最好的方法是在没有父部件的情况下创建它。稍后将设置正确的父级。

这是已知的。我也喜欢这个答案:。因此,在本例中,放置小部件的布局是渲染的关键,而QMainWindow不是布局,但可以自己有一个或几个布局

另一方面,已经负责发布嵌入式小部件,因此没有理由为此类小部件提供父指针。setCentralWidget使一个未登录的小部件处于中心位置,并且可以像在布局中一样正确地绘制。

这是一个已知的小部件。我也喜欢这个答案:。因此,在本例中,放置小部件的布局是渲染的关键,而QMainWindow不是布局,但可以自己有一个或几个布局


另一方面,已经负责发布嵌入式小部件,因此没有理由为此类小部件提供父指针。setCentralWidget使一个未登录的小部件处于中心位置,并且可以像在布局中一样正确地绘制。

因此,我知道QMainWindow有一个假定的布局(带有中心小部件、菜单栏、状态栏等)。如果我理解正确,您是说调用setCentralWidget(&renderSurface)会将renderSurface添加到布局中,这也会使它成为我的主窗口的子窗口?所以基本上,因为QMainWindow包含一个布局,我应该向布局中添加新的子级,而不是将它们作为窗口本身的子级添加?是的,有一个布局,它只是不属于公共api的一部分。正确的方法是使用中心小部件、工具栏、菜单栏、停靠小部件等。。。不建议使用
mainwindow->layout()->addwidget(w)
。请将中心小部件用作小部件的顶级容器。你的主窗口可以为你提供标准的应用程序,比如菜单栏。我明白了!谢谢你的澄清!因此,我知道QMainWindow有一个假定的布局(带有一个中心小部件、菜单栏、状态栏等)。如果我理解正确,您是说调用setCentralWidget(&renderSurface)会将renderSurface添加到布局中,这也会使它成为我的主窗口的子窗口?所以基本上,因为QMainWindow包含一个布局,我应该向布局中添加新的子级,而不是将它们作为窗口本身的子级添加?是的,有一个布局,它只是不属于公共api的一部分。正确的方法是使用中心小部件、工具栏、菜单栏、停靠小部件等。。。Usi