首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QStackedWidget中小部件的共享布局

QStackedWidget中小部件的共享布局
EN

Stack Overflow用户
提问于 2016-12-07 09:11:13
回答 2查看 459关注 0票数 0

我有QStackedWidget和QWidgets。我的QWidgets有一点不同,一个有一个额外的按钮,另一个没有组合框等等,但它们都可以安排在同一个QGridLayout中。

这正是我希望达到的目标。我希望在我的QStackedWidget中有一个QStackedWidget,它是由我的所有QWidgets共享的。此外,我的主窗口(QDockWidget)可以调整大小,我想为网格布局设置不同的列和行长度。

有干净的解决办法吗?

我想出了两个主意。

一种是在每个QGridLayout中都有一个QWidget,并将它们连接在一起,这样当一个人被调整大小时,其他人也会这样做。然而,我拥有的QWidgets越多,它就会越复杂。

我的第二个想法是在每个单元格中有一个带有QStackedWidget的QStackedWidget。QGridLayout越大,维持它就越困难。

我的想法似乎都不太好。

我正在使用PyQt4,但C++中的示例也很受欢迎。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-07 09:49:07

这似乎只需要为堆栈中的每个小部件使用一个共享的addWidgetsToGridLayout函数,它是一个不同的对象,因为它显示了不同的东西。在这个设置中,共享小部件是不好的,所以确保堆栈中的每个小部件都有自己的不同小部件。

我不明白为什么要在调整大小时调整不可见的小部件的大小。当您切换到堆栈上的另一个小部件时,Qt将确保调用适当的事件来适当调整布局大小。

票数 1
EN

Stack Overflow用户

发布于 2016-12-07 17:52:45

布局不能共享。布局系统不是为它而设计的。

您可以拥有一个在布局中创建小部件并返回布局的安装函数。布局包含小部件。然后,您可以将该布局应用于小部件,以这种方式建立内容。安装函数可以接受自定义其行为的参数。例如:

代码语言:javascript
复制
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));
}

当然,您可能希望轻松地引用这些小部件。因此,最好创建一个可以采用多个表单的自定义小部件,并根据需要按值或指针保存该小部件:

代码语言:javascript
复制
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;
    }
  }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41013362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档