配置QWidget以通过布局填充父级

时间:2016-02-03 18:42:37

标签: c++ qt layout

我正在处理QMainWindow应用程序并遇到以下问题: 我有QMainWindow QWidget作为centralWidget,而这个小部件又有另一个QWidget作为子项,应该完全填充第一个(请参阅下面的代码)。< / p>

为了达到这个目的,我使用了布局。但是在将第二个窗口小部件放入布局并将此布局应用于第一个窗口小部件后,第二个窗口小部件仍然不会改变其大小,尽管第一个窗口小部件确实如此(当调整主窗口大小时)。

我将第一个小部件的背景颜色设置为绿色,将第二个小部件的背景颜色设置为红色,因此我希望生成的窗口完全为红色,但是我得到以下输出:

output

为了让第二个小部件填充第一个小部件并相应调整大小,我该怎么做?

主窗口:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QGridLayout>
#include <QMainWindow>
#include <QWidget>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0) : QMainWindow(parent) {

        QWidget *p = new QWidget(this);  // first widget
        p->setStyleSheet("QWidget { background: green; }");
        this->setCentralWidget(p);

        QWidget *c = new QWidget(p);  // second widget
        c->setStyleSheet("QWidget { background: red; }");

        QGridLayout l;
        l.addWidget(c, 0, 0, 1, 1);
        p->setLayout(&l);
    }
};

#endif // MAINWINDOW_H

1 个答案:

答案 0 :(得分:4)

在您的代码中,QGridLayout l是一个局部变量。一旦构造函数代码块超出范围,这将会死亡。所以(1)在类级别添加此QGridLayout l并保持代码的剩余不变 或(2)将其声明为构造函数内的指针,如下所示。代码评论将详细解释。

QWidget *p = new QWidget(this);  // first widget
p->setStyleSheet("QWidget { background: green; }");
this->setCentralWidget(p);

QWidget *c = new QWidget(p);  // second widget
c->setStyleSheet("QWidget { background: red; }");

//Central widget is the parent for the grid layout.
//So this pointer is in the QObject tree and the memory deallocation will be taken care
QGridLayout *l = new QGridLayout(p); 
//If it is needed, then the below code will hide the green color in the border. 
//l->setMargin(0);
l->addWidget(c, 0, 0, 1, 1);
//p->setLayout(&l); //removed. As the parent was set to the grid layout

enter image description here

  

//如果需要,则以下代码将隐藏边框中的绿色。
  的 // 1→setMargin(0);