Set*_*nre 4 c++ qt qscrollarea
我认为这是同样的问题:QScrollArea调整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();//*/
}
Run Code Online (Sandbox Code Playgroud)
编辑::在这里找到了一个解决方案:http: //qt-project.org/forums/viewthread/295
如果你不想在这里阅读大量无用的代码,那么他就会在小部件中扭曲布局
解决方案::从ScrollBar < - Widget < - Layout继承Object
而不是小部件< - ScrollBar < - 布局
但这不是一个真正的解决方案......我将尝试我给出的例子.
有用.有没有人有更好的解决方案?
您不希望在滚动区域本身上设置布局.您引用的答案源于对此的误解.
您需要在滚动区域中拥有一个小部件,然后使用该小部件将该小部件传递给该区域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();
}
Run Code Online (Sandbox Code Playgroud)