2016-05-14 3 views
1

QBoxLayoutで管理されている子ウィジェットのコレクションを含むスクロール可能なウィジェットを作成したいと思います。しかし、子ウィジェットを追加すると、ビューポートウィジェットはサイズが拡大されず(最初のサイズのままになりました)、かわりに重なり合うか、またはそれ自身になります。私はこれを解決するために何をすべきかわかりません。ここでQtビューポートウィジェットが新しい子ウィジェットの間にQBoxLayoutに追加されていない

コードです:

mainwidget.h

#ifndef MAINWIDGET_H 
#define MAINWIDGET_H 

#include <QtGui/QScrollArea> 
#include <QResizeEvent> 
#include <QDebug> 

class CMainWidget : public QScrollArea 
{ 
    Q_OBJECT 

public: 
    CMainWidget(QWidget *parent = 0); 
    ~CMainWidget(); 

protected: 
    virtual void resizeEvent(QResizeEvent *pEvent); 
    virtual void keyPressEvent(QKeyEvent *pEvent); 
}; 

#endif // MAINWIDGET_H 

mainwidget.cppここ

#include "mainwidget.h" 
#include "rootitem.h" 

CMainWidget::CMainWidget(QWidget *parent) 
    : QScrollArea(parent) 
{ 
    QWidget* pViewport = new QWidget(); 
    QBoxLayout* pLayout = new QBoxLayout(QBoxLayout::TopToBottom); 

    pLayout->setSizeConstraint(QLayout::SetNoConstraint); 

    for (int iWidgetIndex = 0; iWidgetIndex < 20; iWidgetIndex++) 
     pLayout->addWidget(new CRootItem()); 

    pViewport->setLayout(pLayout); 
    pViewport->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding); 

    setWidget(pViewport); 
} 

CMainWidget::~CMainWidget() 
{ 

} 


void CMainWidget::resizeEvent(QResizeEvent *pEvent) 
{ 
    QWidget* pViewport = widget(); 

    int iHeight = pViewport->height(); 
    int iWidth = pEvent->size().width(); 

    pViewport->resize(iWidth, iHeight); 
} 


void CMainWidget::keyPressEvent(QKeyEvent *pEvent) 
{ 
    QWidget* pViewport = widget(); 

    QBoxLayout* pLayout = (QBoxLayout*)pViewport->layout(); 

    if (pEvent->key() == Qt::Key_Space) 
    { 
     pLayout->addWidget(new CRootItem()); 

     qDebug() << "adding..."; 
    } 

    if (pEvent->key() == Qt::Key_C) 
    { 
     if (!pLayout->isEmpty()) 
     { 
      QLayoutItem* pItem = pLayout->itemAt(0); 
      pLayout->removeItem(pItem); 

      delete pItem->widget(); 
      delete pItem; 

      qDebug() << "removing..."; 
     } 
    } 
} 

は、画像ウィッヒは、新しいアイテムのカップルをinsering後にオーバーラップ子ウィジェットを示しています。 enter image description here

EDIT

私のproplenをダーティーなアプローチで解決してください:差し引きを行い、ビューポートからアイテム固定高さを追加してください。もっとファッションこの問題を処理する方法はありますか?

コード:

void CMainWidget::keyPressEvent(QKeyEvent *pEvent) 
{ 
    QWidget* pViewport = widget(); 

    QBoxLayout* pLayout = (QBoxLayout*)pViewport->layout(); 

    if (pEvent->key() == Qt::Key_Space) 
    { 
     QWidget* pItem = new CRootItem(); 

     pLayout->addWidget(pItem); 

     QSize Size = pViewport->size(); 

     Size.rheight() += pItem->height() + pLayout->spacing(); 

     pViewport->resize(Size); 

     qDebug() << "adding..."; 
    } 

    if (pEvent->key() == Qt::Key_C) 
    { 
     if (!pLayout->isEmpty()) 
     { 
      QLayoutItem* pItem = pLayout->itemAt(0); 
      pLayout->removeItem(pItem); 

      QSize Size = pViewport->size(); 

      Size.rheight() -= pItem->widget()->height() + pLayout->spacing(); 

      pViewport->resize(Size); 

      delete pItem->widget(); 
      delete pItem; 

      qDebug() << "removing..."; 
     } 
    } 
} 
+0

'resizeEvent'の実装をコメントアウトし、それが動作するかどうかを確認してください。 –

+0

@Jon Harper:ありがとう!)それは私が探しているものです!))) – Mykola

答えて

1

あなたresizeEventをコメントアウトします。ウィジェットがトップレベルのウィンドウでない限り、ウィジェットの明示的なサイズや位置を設定する必要はほとんどありません。レイアウトは仕事をさせてください。

関連する問題