6

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

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

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

我认为问题来自单一来源:: Size Hints and Layouts ( 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 <- 布局

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

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

4

1 回答 1

10

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

  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();
}
于 2013-09-09T18:06:20.123 回答