QGridLayout:你必须将这个网格插入到另一个布局中

QGridLayout: You must insert this grid into another layout

http://doc.qt.io/qt-4.8/qgridlayout.html#QGridLayout-2

下面这句话是什么意思?

You must insert this grid into another layout. You can insert widgets and layouts into this layout at any time, but laying out will not be performed before this is inserted into another layout.

我没有将它插入到任何布局中,也没有设置父级。为什么这有效?

void Screen::displayWordOnScreen()
{
    for (uint i = 0; i < NumOfBlanks; i++)
    {
        blank[i] = createBlank (SLOT (blankFilled (QString)));
    }

    QGridLayout *mainLayout = new QGridLayout;
    mainLayout->setSizeConstraint (QLayout::SetFixedSize);

    for (uint i = 0; i < NumOfBlanks; i++)
    {
        mainLayout->addWidget (blank[i], 0, i);
    }

    setLayout (mainLayout);
}

我不知道为什么文档是这样写的,但你不必在布局中添加布局。你可以,但你不必。

您可以像在代码中一样为小部件设置布局。事实上,在某些时候你必须这样做。如果您必须将每个布局添加到另一个布局,那么您将没有管理小部件布局的布局。你只会有什么都不做的布局。所以文档中的那句话没有意义。

这是一个文档错误。纯粹而简单。

setMainLayout 调用是多余的。您可以通过将它应该作为其父级的小部件来设置布局:

 auto mainLayout = new QGridLayout(this);

您也不需要动态创建布局 - 它可以按值保存。由于 NumOfBlanks 似乎是一个编译时常量,您可以将其全部简化:

class Blank : public QWidget {
  Q_OBJECT
public:
  Q_SIGNAL void blankFilled(const QString &);
  ...
};

class Screen : public QWidget {
  Q_OBJECT
  enum { NumOfBlanks = 10; }
  QGridLayout m_layout(this);
  std::array<Blank, NumOfBlanks> m_blanks;
  void onBlankFilled(Blank *, const QString &);
public:
  explicit Screen(QWidget *parent = nullptr);
  void displayWordOnScreen();
};

Screen::Screen(QWidget *parent) : QWidget(parent) {
  int i = 0;
  for (auto &blank : m_blanks) {
    connect(&blank, &Blank::blankFilled, [&](const QString &){
      onBlankFilled(&blank, data);
    });
    m_layout.addWidget(&blank, 0, i++);
    blank.hide();
  }
  m_layout.setSizeConstraint(QLayout::SetFixedSize);
}

void Screen::displayWordOnScreen() {
  for (auto &blank : m_blanks)
    blank.show();
}