QScrollArea缺少滚动条

Set*_*nre 4 c++ qt qscrollarea

我认为这是同样的问题:QScrollArea调整QWidget的大小

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

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

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

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

我目前正在寻找丢失滚动条的解决方案

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

<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();//*/
}
Run Code Online (Sandbox Code Playgroud)

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

如果你不想在这里阅读大量无用的代码,那么他就会在小部件中扭曲布局

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

而不是小部件< - ScrollBar < - 布局

但这不是一个真正的解决方案......我将尝试我给出的例子.

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

Rei*_*ica 7

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

  1. 您需要在滚动区域中拥有一个小部件,然后使用该小部件将该小部件传递给该区域QScrollArea::setWidget.如果滚动区域内的所有内容都是一个没有子项的窗口小部件,那么您不需要额外的布局.

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

  3. QScrollArea插件是不是它的外围部件内的布局.

以下是如何执行此操作的工作示例:

// 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();
}
Run Code Online (Sandbox Code Playgroud)