2013-09-09 5 views
5

Я думаю, что это та же проблема, как: QScrollArea resizing QWidgetQScrollArea отсутствует Полоса прокрутки

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

  • тест 2 унаследованный от QWidget:
    • составе:
      • вектор QSpinBox
      • QScrollArea
      • QVBoxLayout
    • test2 (QWidget) < - QScrollArea < - QVBoxLayout < - со счётчиком
  • Проблемы: не
    • Там еще нет полосы прокрутки
    • [FIXED] Внутри скроллинга усаживается, чтобы соответствовать так мало места, ничто не может быть прочитан (окно может быть изменен во время выполнения, что приведет к внутренней, чтобы получить больше и быть читаемыми все-таки не будет отображаться не полосы прокрутки)

Думаю проблемы ком e из одного источника :: Размер подсказок и макетов (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();//*/ 
} 

EDIT :: нашел решение здесь: http://qt-project.org/forums/viewthread/295

если вы дон Не хочу читать огромное количество бесполезного кода здесь, что он сделал: он исказил макет внутри виджета

Solution :: наследуют объект от ScrollBar < - Widget < - Layout

вместо виджета < - ScrollBar < - Layout

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

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

ответ

6

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

  1. Вы должны иметь виджет внутри ScrollArea, и передать этот виджет в области с помощью 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(); 
} 
+0

Человек это помогло мне :) Большое спасибо – murison