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