QScrollArea 缺少滚动条

2021-12-09 00:00:00 qt qscrollarea c++

我认为这是与以下相同的问题:QScrollArea resizing QWidget

I think it is the same problem as : QScrollArea resizing QWidget

但没有解决方案.所以让我揭露这个问题.

but there are not solution. so let me expose the problem.

  • 测试2继承自QWidget:
    • 组成:
      • QSpinBox 的向量
      • QScrollArea
      • QVBoxLayout
      • 没有滚动条
      • [FIXED] 滚动条的内部被缩小以适应如此小的空间,无法读取任何内容(可以在执行期间调整窗口大小,这将导致内部变大且可读,但不会出现滚动条)

      我认为问题来自单一来源 :: 尺寸提示和布局 (http://qt-project.org/doc/qt-5.1/qtwidgets/qscrollarea.html#details)

      I Think problems come from a single source :: Size Hints and Layouts (http://qt-project.org/doc/qt-5.1/qtwidgets/qscrollarea.html#details)

      第二个问题(缩小的widget)可以通过设置"c->setSizeConstraint(QLayout::SetMinimumSize);"来解决

      The second problem (shrinked widget) can be solved by setting "c->setSizeConstraint(QLayout::SetMinimumSize);"

      我目前正在寻找缺少滚动条的解决方案

      I am currently seeking a solution for the missing scrollbar

      这是显示我的问题的代码:

      here is a code showing my problem :

      <c++>
      #include <QWidget>
      #include <QScrollArea>
      #include <QVBoxLayout>
      #include <QSpinBox>
      
      class test2 : public QWidget
      {
              Q_OBJECT
          public:
              test2(QWidget *parent = 0) :QWidget(parent)
              {
                  b = new QScrollArea(this);
                  c = new QVBoxLayout;
      
                  for (int i = 0; i < 10; i++)
                  {
                      a.push_back(new QSpinBox());
                      c->addWidget(a[i]);
                  }
      
                  c->setSizeConstraint(QLayout::SetMinimumSize);
                  b->setLayout(c);
                  b->resize(200, 200);
              }
      
              ~test2()
              {
                  for (int i = 0; i < 10; i++)
                      delete a[i];
              }
      
          protected:
      
              QVector<QSpinBox*> a;
              QScrollArea* b;
              QVBoxLayout* c;
      
      };
      
      
      int main(int argc, char *argv[])
      {
          ///*
          QApplication app(argc, argv);
      
          test2 a;
      
          a.show();
      
          return app.exec();//*/
      }
      

      编辑 :: 在这里找到了解决方案:http://qt-project.org/forums/viewthread/295

      EDIT :: found a Solution here: http://qt-project.org/forums/viewthread/295

      如果你不想在这里阅读大量无用的代码,他做了什么 ::他扭曲了小部件内的布局

      if you don't want to read huge amount of useless code here what he has done :: he warped the layout inside a widget

      解决方案::从ScrollBar继承Object <- Widget <- Layout

      Solution :: inherit the Object from ScrollBar <- Widget <- Layout

      代替小部件 <- ScrollBar <- Layout

      instead of widget <- ScrollBar <- Layout

      但它的解决方法并不是真正的解决方案......我要尝试我给出的例子.

      but it a work around not really a solution... I going to try on the example I gave.

      它有效.有没有人有更好的解决方案??

      it works. Does anyone have a better solution ??

      推荐答案

      您不想在滚动区域本身上设置布局.您引用的答案源于对此的误解.

      You do not want to set the layout on the scroll area itself. The answer you cite stems from misunderstanding this.

      1. 您需要在滚动区域内有一个小部件,然后使用 QScrollArea::setWidget 将该小部件传递到该区域.如果滚动区域内只有一个没有子项的小部件,那么您不需要额外的布局.

      1. You need to have a widget within a scrollarea, and you pass that widget to the area using QScrollArea::setWidget. If all you have inside the scroll area is one widget with no children, then you don't need additional layout.

      您无需手动跟踪布局拥有的小部件.删除具有布局的小部件后,它们将自动删除.

      You do not need to manually keep track of widgets that are owned by a layout. They'll be deleted automatically once the widget that has the layout is deleted.

      QScrollArea 小部件未布置在其封闭小部件中.

      The QScrollArea widget is not laid out within its enclosing widget.

      以下是如何操作的示例:

      Below is a working example of how to do it:

      // https://github.com/KubaO/stackoverflown/tree/master/questions/scroll-18703286
      #include <QScrollArea>
      #include <QVBoxLayout>
      #include <QSpinBox>
      #include <QApplication>
      
      class Window : public QWidget
      {
         QVBoxLayout m_layout{this};
         QScrollArea m_area;
         QWidget m_contents;
         QVBoxLayout m_contentsLayout{&m_contents};
         QSpinBox m_spinBoxes[10];
      public:
         Window(QWidget *parent = {}) : QWidget(parent) {
            m_layout.addWidget(&m_area);
            m_area.setWidget(&m_contents);
            for (auto & spinbox : m_spinBoxes)
               m_contentsLayout.addWidget(&spinbox);
            m_contentsLayout.setSizeConstraint(QLayout::SetMinimumSize);
         }
      };
      
      int main(int argc, char *argv[])
      {
         QApplication app(argc, argv);
         Window w;
         w.show();
         return app.exec();
      }
      

相关文章