Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
238 views
in Technique[技术] by (71.8m points)

c++ - QScrollArea missing Scrollbar

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

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

  • test 2 inherited from QWidget:
    • composed :
      • vector of QSpinBox
      • QScrollArea
      • QVBoxLayout
    • test2 (QWidget) <- QScrollArea <- QVBoxLayout <- Spinbox
  • Problems :
    • There are no scrollbar
    • [FIXED] The inside of the scrollbar is shrinked to fit so little space nothing can be read (the window can be resized during execution that will cause the inside to get bigger and be readable nevertheless no scrollbar will appear)

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

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

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

Solution :: inherit the Object from ScrollBar <- Widget <- 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 ??

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

  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.

  2. 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.

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...