2016-12-02 23 views
1

http://doc.qt.io/qt-4.8/qgridlayout.html#QGridLayout-2QGridLayout:您必须插入此网格到另一个布局

什么是以下报价是什么意思?

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

我还没有将它插入任何布局,也没有设置父级。为什么这个工作?

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

回答

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(); 
} 
1

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

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

相关问题