无法理解QScrollArea / QVboxLayout的工作原理

时间:2015-05-22 14:42:15

标签: c++ qt qscrollarea

我正在尝试将一些自定义小部件垂直对齐到scrolledArea中。一些研究引导我制作QVboxLayout,在其中添加QScrollArea。 我尝试了,但我没有设法以适当的方式做到这一点。

我发现有些人使用两个QVboxLayout和Widget级别,例如在这些页面上: http://www.linuxforums.org/forum/programming-scripting/155452-solved-using-qt-scroll-area.html http://kunalmaemo.blogspot.fr/2010/07/scrolling-in-custom-widget-using.html 我不明白为什么,但我也试过。

我也读过这个并试过,但仍然无效: QScrollArea missing Scrollbar

我必须做错事但我不知道是什么。有时我的小部件不会滚动并且只是扁平化,有时小部件根本不会出现,但永远不会成功显示单个滚动区域。这是我目前的代码版本(我认为已经简化了):

MainWIndowImp.h

class MainWindowImp : public QMainWindow, public Ui_MainWindow
{
Q_OBJECT
public :
    MainWindowImp() ;
    ~MainWindowImp() ;

    //more
public slots :
    //some stuff
private
    std::vector<SliderFloat*> _sliders ; //custom widget, works fine
}

ui_mainwindow.h

class Ui_MainWindow
{
public:
    QWidget *centralwidget;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        centralwidget = new QWidget(MainWindow);
                _slider_GB = new QGroupBox(centralwidget);
        _slider_GB->setObjectName(QString::fromUtf8("_slider_GB"));
        _slider_GB->setGeometry(QRect(630, 10, 351, 351));
        _mainScrollArea = new QScrollArea(_slider_GB);
        _mainScrollArea->setObjectName(QString::fromUtf8("_mainScrollArea"));
        _mainScrollArea->setGeometry(QRect(10, 40, 331, 301));
        _mainScrollArea->setWidgetResizable(true);
        scrollAreaWidgetContents = new QWidget();
        scrollAreaWidgetContents->setObjectName(QString::fromUtf8("scrollAreaWidgetContents"));
        scrollAreaWidgetContents->setGeometry(QRect(0, 0, 329, 299));
        _mainScrollArea->setWidget(scrollAreaWidgetContents);
    }
}

MainWindowImp.cpp

MainWindowImp::MainWindowImp()
{
    setupUi(this)
}

void MainWindowImp::updateSliders()
{
    QVBoxLayout *mainLayout = new QVBoxLayout(this) ;
    mainLayout->addWidget(_mainScrollArea);
    QWidget *contents = new QWidget ;
    QVBoxLayout *layout = new QVBoxLayout(contents) ;

    for(uint32_t i=0;i<_approx->latentVariables().cols();++i)
    {
        layout->addWidget(_sliders[i]) ;
    }
    layout->setSizeConstraint(QLayout::SetMinimumSize);
    _mainScrollArea->setWidget(contents);

}

请注意,我使用了QtDesigner作为GUI,我只需在其中设置QScrollArea _mainScrollArea,它会自动设置QWidget scrollAreaWidgetContents并将其设置为QScrollArea。也许我的问题来自它?

感谢您的回复

编辑:

这里是mainwindow.ui文件(删除了很​​多不相关的东西):

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>1002</width>
    <height>524</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Main Window</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <property name="minimumSize">
    <size>
     <width>981</width>
     <height>0</height>
    </size>
   </property>
   <widget class="MyGLViewer" name="_qglv" native="true">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>10</y>
      <width>600</width>
      <height>400</height>
     </rect>
    </property>
    <property name="minimumSize">
     <size>
      <width>125</width>
      <height>100</height>
     </size>
    </property>
    <property name="maximumSize">
     <size>
      <width>800</width>
      <height>600</height>
     </size>
    </property>
    <property name="mouseTracking">
     <bool>false</bool>
    </property>
   </widget>
   <widget class="QGroupBox" name="_slider_GB">
    <property name="geometry">
     <rect>
      <x>630</x>
      <y>10</y>
      <width>351</width>
      <height>351</height>
     </rect>
    </property>
    <property name="title">
     <string>Coordinates</string>
    </property>
    <widget class="QScrollArea" name="_mainScrollArea">
     <property name="geometry">
      <rect>
       <x>10</x>
       <y>40</y>
       <width>331</width>
       <height>301</height>
      </rect>
     </property>
     <property name="widgetResizable">
      <bool>true</bool>
     </property>
     <widget class="QWidget" name="scrollAreaWidgetContents">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>329</width>
        <height>299</height>
       </rect>
      </property>
     </widget>
    </widget>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
  <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>1002</width>
     <height>29</height>
    </rect>
   </property>
  </widget>
 </widget>
 <customwidgets>
  <customwidget>
   <class>MyGLViewer</class>
   <extends>QWidget</extends>
   <header>myglviewer.h</header>
   <container>1</container>
  </customwidget>
 </customwidgets>
 <resources/>
 <connections/>
</ui>

0 个答案:

没有答案