我有QStackedWidget和QWidgets。我的QWidgets有一点不同,一个有一个额外的按钮,另一个没有组合框等等,但它们都可以安排在同一个QGridLayout中。
这正是我希望达到的目标。我希望在我的QStackedWidget中有一个QStackedWidget,它是由我的所有QWidgets共享的。此外,我的主窗口(QDockWidget)可以调整大小,我想为网格布局设置不同的列和行长度。
有干净的解决办法吗?
我想出了两个主意。
一种是在每个QGridLayout中都有一个QWidget,并将它们连接在一起,这样当一个人被调整大小时,其他人也会这样做。然而,我拥有的QWidgets越多,它就会越复杂。
我的第二个想法是在每个单元格中有一个带有QStackedWidget的QStackedWidget。QGridLayout越大,维持它就越困难。
我的想法似乎都不太好。
我正在使用PyQt4,但C++中的示例也很受欢迎。
发布于 2016-12-07 09:49:07
这似乎只需要为堆栈中的每个小部件使用一个共享的addWidgetsToGridLayout函数,它是一个不同的对象,因为它显示了不同的东西。在这个设置中,共享小部件是不好的,所以确保堆栈中的每个小部件都有自己的不同小部件。
我不明白为什么要在调整大小时调整不可见的小部件的大小。当您切换到堆栈上的另一个小部件时,Qt将确保调用适当的事件来适当调整布局大小。
发布于 2016-12-07 17:52:45
布局不能共享。布局系统不是为它而设计的。
您可以拥有一个在布局中创建小部件并返回布局的安装函数。布局包含小部件。然后,您可以将该布局应用于小部件,以这种方式建立内容。安装函数可以接受自定义其行为的参数。例如:
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));
}当然,您可能希望轻松地引用这些小部件。因此,最好创建一个可以采用多个表单的自定义小部件,并根据需要按值或指针保存该小部件:
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;
}
}
};https://stackoverflow.com/questions/41013362
复制相似问题