2016-12-07 62 views
0

我有一個QStackedWidget與QWidgets。我的QWidgets有點不同,有一個額外的按鈕,其他的沒有組合框等,但所有這些都可以安排在同一個QGridLayout中。QStackedWidget中的小部件的共享佈局

而這正是我想達到的。我想在我的QStackedWidget中有一個QGridLayout,它由我所有的QWidgets共享。此外,我的主窗口(QDockWidget)可以調整大小,我想爲網格佈局設置不同的列和行拉伸。

這是乾淨的解決方案嗎?

我想出了兩個想法。

一個是在每個QWidget中都有一個QGridLayout,並將它們全部連接起來,這樣當一個被調整大小時,其他人也會這樣做。但是,我擁有的QWidgets越多,它就會越複雜。

我的第二個想法是在每個單元格中都有一個帶有QStackedWidget的QGridLayout。 QGridLayout越大,維護它就越困難。

我的想法似乎都不錯。

我使用的是PyQt4,但在C++中的示例也是受歡迎的。

+0

「乾淨的解決方案」是爲了什麼?你還沒有解釋你想要解決什麼問題。 – ekhumoro

回答

1

這看起來似乎沒有什麼比共享addWidgetsToGridLayout函數更適合堆棧中的每個小部件,這是一個不同的對象,因爲它顯示了不同的東西。在這個設置中共享小部件是不好的,所以要確保堆棧中的每個小部件都有自己獨特的小部件。

我不明白你爲什麼想在調整大小時調整隱藏的小部件。當你切換到棧上的另一個小部件時,Qt將確保正確的事件被調用來正確調整佈局的大小。

0

佈局不能共享。佈局系統不是爲它設計的。

您可以使用設置功能在佈局中創建小部件並返回佈局。佈局帶有小部件。然後,您可以將該佈局應用於小部件,以此方式確定內容。設置功能可以採用自定義其行爲的參數。例如:

enum WidgetType { 
    Normal, WithButton, WithCombo 
}; 

QGridLayout* setup(WidgetType type) { 
    auto l = new QGridLayout; 
    l.addWidget(0, 0, new QLabel("Hello")); 
    l.addWidget(0, 1, new QLabel("World")); 
    switch (type) { 
    case WithButton: 
    l.addWidget(1, 0, new QPushButton("Click Me!")); 
    break; 
    case WithCombo: 
    if (auto combo = new QComboBox) { 
     ... 
     l.addWidget(1, 1, combo); 
    } 
    break; 
    case Normal: 
    break; 
    } 
    return l; 
}; 

void test() { 
    QWidget w1, w2; 
    w1.setLayout(setup(Normal)); 
    w2.setLayout(setup(WithButton)); 
} 

當然,大概您會想要輕鬆引用小部件。因此,它是您創建一個能夠採取multple表單的自定義窗口小部件最好,並根據需要通過值或指針指向小部件:

class Widget : public QWidget { 
    QGridLayout m_layout{this}; 
    QLabel m_label1("Hello"); 
    QLabel m_label2("World"); 
    QPointer<QPushButton> m_button; 
    QPointer<QComboBox> m_combo; 
public: 
    Widget(WidgetType type, QWidget *parent = nullptr) : QWidget(parent) { 
    m_layout.addWidget(0, 0, &m_label1); 
    m_layout.addWidget(0, 1, &m_label2); 
    switch (type) { 
    case WithButton: 
     m_button = new QPushButton("Click Me!"); 
     m_layout.addWidget(1, 0, m_button.data()); 
     break; 
    case WithCombo: 
     m_combo = new QComboBox; 
     ... 
     m_layout.addWidget(1, 1, m_combo.data()); 
     break; 
    case Normal: 
     break; 
    } 
    } 
};