【问题标题】:How to create a scrollable QVBoxLayout?如何创建可滚动的 QVBoxLayout?
【发布时间】:2011-09-27 19:19:06
【问题描述】:

我正在尝试将QVBoxLayout 放入QScrollArea 中,以使其垂直滚动。但是似乎没有添加项目。

我看到一个建议,我应该创建一个 ScrollArea 使用的内部小部件并将布局放置在其中,尽管它似乎不起作用。我的结构应该是这样的:

+-------------------------------
| QScrollArea(realmScroll)
| +----------------------------
| | QWidget(realmScrollInner)
| | +-------------------------
| | | QVBoxLayout(realmLayout)

以及执行此操作的代码:

# Irrelevant, added for context (this works)
centralWidget = QWidget(self)
self.container = QVBoxLayout(centralWidget)
centralWidget.setLayout(self.container)
self.setCentralWidget(centralWidget)

# Where trouble starts
self.realmScroll = QScrollArea(self.container.widget())
self.realmScroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)

self.realmLayout = QVBoxLayout(self.container.widget())

self.realmScrollInner = QWidget(self.realmScroll)
self.realmScrollInner.setLayout(self.realmLayout)

self.realmScroll.setWidget(self.realmScrollInner)
self.container.addWidget(self.realmScroll)

# Doesn't add to realmLayout
self.realmLayout.addWidget(QLabel("test"))

我仍在学习 Qt(2 天),因此我将不胜感激深入回答我哪里出错了。

更新

似乎addWidget(QLabel()) 一直有效,直到realmScrollInner 被设置为realmScroll 的小部件。因为我想在 UI 显示后添加元素,所以我必须这样做,我不确定这是否真的正确:

self.realmLayout.addWidget(QLabel("test"))

# realmScrollInner bound to realmScroll
realmScroll.setWidget(realmScrollInner)
self.container.addWidget(realmScroll)

# Access realmScroll's widget and then layout to add
realmScroll.widget().layout().addWidget(QLabel("test"))

但是,如果您在绑定小部件之前删除对addWidget 的第一次调用(因此布局没有小部件),则绑定到之后添加的 ScrollArea 小部件不会显示。也许 ScrollArea 需要重新绘制(尽管我没有看到这样做的方法)?

更新 2:在 realmScroll 或其包含的小部件上调用 repaint() 没有任何作用,在布局上调用 activate/update() 也是如此。

【问题讨论】:

    标签: qt pyqt


    【解决方案1】:

    尝试调用

    self.realmScroll.setWidgetResizable(True)
    

    【讨论】:

      【解决方案2】:

      事实证明,将布局作为小部件的布局导致我走错了路。执行此操作的实际方法很简单:

      scrollarea = QScrollArea(parent.widget())
      layout = QVBoxLayout(scrollarea)
      realmScroll.setWidget(layout.widget())
      
      layout.addWidget(QLabel("Test"))
      

      我很确定我最初尝试过,但是它正在工作。

      然而这增加了一个问题,即布局的项目被垂直收缩,而不是导致滚动区域添加滚动条。

      【讨论】:

      【解决方案3】:

      好的,我刚刚解决了这个问题。这是一个可以进入滚动区域(scrollarea->setWidget)并正常工作的小部件。它包含一个 QVBoxLayout 和一个标签/列表小部件对列表,每对都有自己的小水平布局,它几乎可以满足您的需求。

      重要的是阅读有关尺寸提示和布局的 QScrollArea 文档部分,并找到需要在布局上设置 sizeContraint QLayout::SetMinAndMaxSize 的位置。

      class MappingDisplayWidget : public QWidget
      {
          Q_OBJECT
      public:
          explicit MappingDisplayWidget(QWidget *parent = 0);
          void addFile(QString name);
      private:
          QVBoxLayout *m_layout;
          QMap<QString, QListWidget *>  m_mappings;  
      };
      
      
      MappingDisplayWidget::MappingDisplayWidget(QWidget *parent) :
          QWidget(parent)
      {
          m_layout = new QVBoxLayout;
          m_layout->setSizeConstraint(QLayout::SetMinAndMaxSize);
          setLayout(m_layout);
      }
      
      
      void MappingDisplayWidget::addFile(QString name) {
          if (m_mappings.find(name) == m_mappings.end()) {
              QWidget *widg = new QWidget;
      
              QHBoxLayout *lay = new QHBoxLayout;
              widg->setLayout(lay);
      
              QLabel *nlab = new QLabel(name);
              lay->addWidget(nlab);
      
              QListWidget *list = new QListWidget;
              lay->addWidget(list);
      
              m_layout->addWidget(widg);
      
              m_mappings[name] = list;
          }
      }
      

      我保留了指向列表小部件的指针,以便以后可以向它们添加内容,而且效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-15
        • 2019-05-13
        • 1970-01-01
        • 2020-09-05
        • 1970-01-01
        • 2016-05-03
        相关资源
        最近更新 更多