2016-12-02 2 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

왜 문서가 그런 식으로 쓰여 있는지 모르겠지만 레이아웃에 레이아웃을 추가 할 필요는 없습니다. 할 수는 있지만 할 필요는 없습니다.

코드에서 수행하는 것처럼 위젯에 레이아웃을 설정할 수 있습니다. 사실 어떤 시점에서 그렇게해야합니다. 각 레이아웃을 다른 레이아웃에 추가해야하는 경우 위젯의 레이아웃을 관리하는 레이아웃이 없습니다. 당신은 아무것도하지 않는 레이아웃을 가지고있을뿐입니다. 그래서 문서의 문장은 말이되지 않습니다.

관련 문제