QScrollArea отсутствует полоса прокрутки

Я думаю, что это та же проблема, что и: QScrollArea изменяет размер QWidget

но нет решения. так позвольте мне разоблачить проблему.

  • Тест 2, унаследованный от QWidget:
    • составлено:
      • вектор QSpinBox
      • QScrollArea
      • QVBoxLayout
    • test2 (QWidget) <- QScrollArea <- QVBoxLayout <- Spinbox
  • Проблемы :
    • Нет полосы прокрутки
    • [ИСПРАВЛЕНО] Внутренняя часть полосы прокрутки сжимается, чтобы уместить ее так мало места, что ничего не может быть прочитано (окно может быть изменено во время выполнения, что приведет к увеличению внутренней части и ее удобочитаемости, но полоса прокрутки не появится)

Я думаю, что проблемы приходят из одного источника :: Размер подсказки и макеты (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 <- виджет <- макет

вместо виджета <- Полоса прокрутки <- макет

но это обходной путь не совсем решение …
Я собираюсь примерить пример, который я привел.

оно работает. У кого-нибудь есть лучшее решение ??

4

Решение

Вы не хотите устанавливать макет на самой области прокрутки. Ответ, который вы цитируете, проистекает из недопонимания этого.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]