我认为这是与以下相同的问题:QScrollArea resizing QWidget
I think it is the same problem as : QScrollArea resizing QWidget
但没有解决方案.所以让我揭露这个问题.
but there are not solution. so let me expose the problem.
我认为问题来自单一来源 :: 尺寸提示和布局 (http://qt-project.org/doc/qt-5.1/qtwidgets/qscrollarea.html#details)
I Think problems come from a single source :: Size Hints and Layouts (http://qt-project.org/doc/qt-5.1/qtwidgets/qscrollarea.html#details)
第二个问题(缩小的widget)可以通过设置"c->setSizeConstraint(QLayout::SetMinimumSize);"来解决
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();//*/
}
编辑 :: 在这里找到了解决方案:http://qt-project.org/forums/viewthread/295
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
解决方案::从ScrollBar继承Object <- Widget <- Layout
Solution :: inherit the Object from ScrollBar <- Widget <- Layout
代替小部件 <- ScrollBar <- 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 ??
您不想在滚动区域本身上设置布局.您引用的答案源于对此的误解.
You do not want to set the layout on the scroll area itself. The answer you cite stems from misunderstanding this.
您需要在滚动区域内有一个小部件,然后使用 QScrollArea::setWidget
将该小部件传递到该区域.如果滚动区域内只有一个没有子项的小部件,那么您不需要额外的布局.
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.
您无需手动跟踪布局拥有的小部件.删除具有布局的小部件后,它们将自动删除.
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.
QScrollArea
小部件未布置在其封闭小部件中.
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();
}
这篇关于QScrollArea 缺少滚动条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!