QScrollArea缺少滚动条

时间:2013-09-09 16:59:44

标签: c++ qt qscrollarea

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

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

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

我认为问题来自单一来源::大小提示和布局(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();//*/
}

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

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

解决方案::从ScrollBar&lt; - Widget&lt; - Layout

继承Object

而不是widget&lt; - ScrollBar&lt; - Layout

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

  3. QScrollArea窗口小部件未在其封闭的窗口小部件中布局。

  4. 以下是如何操作的工作示例:

    // 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();
    }