2016-12-07 63 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; 
    } 
    } 
};