首页 文章

QScrollArea缺少滚动条

提问于
浏览
4

我认为这是同样的问题:QScrollArea resizing QWidget

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

从QWidget继承的

  • test 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 < - Widget < - Layout继承Object

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

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

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

1 回答

  • 6

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

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

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

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

相关问题