1

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

以下引用是什么意思?

您必须将此网格插入到另一个布局中。您可以随时将小部件和布局插入此布局,但在将其插入另一个布局之前不会执行布局。

我没有将它插入任何布局,也没有设置父级。为什么这行得通?

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);
}
4

2 回答 2

1

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

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();
}
于 2016-12-02T14:49:57.250 回答
1

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

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

于 2016-12-02T13:35:39.497 回答