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

我不知道爲什麼這樣的文檔是這樣寫的,但是您不必將佈局添加到佈局。你可以,但你不必。

您可以像在代碼中一樣將佈局設置爲小部件。事實上,在某些時候你必須這樣做。如果您不得不將每個佈局添加到另一個佈局,那麼您將不會擁有管理該窗口小部件佈局的佈局。你只需要佈置什麼都不做。所以文檔中的這句話是沒有意義的。

相關問題