我认为这与以下问题相同:QScrollArea resizing QWidget
但没有解决方案。所以让我揭露问题。
我认为问题来自单一来源::大小提示和布局(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
但这不是一个真正的解决方案...... 我将尝试我给出的例子。
它有效。有没有人有更好的解决方案?
答案 0 :(得分: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();
}