2011-07-03 23 views
22

QVBoxLayoutQScrollAreaの内側に配置しようとすると、垂直方向にスクロールできるようになります。しかし、アイテムはそれに追加されていないようです。スクロール可能なQVBoxLayoutを作成するには?

私は、ScrollAreaが使用する内部ウィジェットを作成し、内部にレイアウトを配置するべきであるとの提案を見ましたが、うまくいきませんでした。私の構造はこのように見えるようになっている:私はどこに

# Irrelevant, added for context (this works) 
centralWidget = QWidget(self) 
self.container = QVBoxLayout(centralWidget) 
centralWidget.setLayout(self.container) 
self.setCentralWidget(centralWidget) 

# Where trouble starts 
self.realmScroll = QScrollArea(self.container.widget()) 
self.realmScroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) 

self.realmLayout = QVBoxLayout(self.container.widget()) 

self.realmScrollInner = QWidget(self.realmScroll) 
self.realmScrollInner.setLayout(self.realmLayout) 

self.realmScroll.setWidget(self.realmScrollInner) 
self.container.addWidget(self.realmScroll) 

# Doesn't add to realmLayout 
self.realmLayout.addWidget(QLabel("test")) 

私はまだ(2日間で)のQtを学んでいるので、詳細な答えを:

+------------------------------- 
| QScrollArea(realmScroll) 
| +---------------------------- 
| | QWidget(realmScrollInner) 
| | +------------------------- 
| | | QVBoxLayout(realmLayout) 

、コードはこれを行うには間違っていると感謝します。

更新は:

すぐにrealmScrollInnerまでaddWidget(QLabel())作品はrealmScrollのウィジェットとして設定されているようです。

self.realmLayout.addWidget(QLabel("test")) 

# realmScrollInner bound to realmScroll 
realmScroll.setWidget(realmScrollInner) 
self.container.addWidget(realmScroll) 

# Access realmScroll's widget and then layout to add 
realmScroll.widget().layout().addWidget(QLabel("test")) 

しかし、あなたはaddWidgetへの最初の呼び出しを削除する場合は、ウィジェットが持って前に:UIは本当に正しいです、私はわからないんだけどこれは、私がこれをしなければならない表示された後、私は、要素を追加したいと思いますので、 (レイアウトにウィジェットがないため)、その後に追加されたScrollAreaウィジェットにバインドされません。おそらく、ScrollAreaは再描画が必要です(私にはそのためのメソッドはありません)。

アップデート2:レイアウトにactivate/update()を呼び出す場合と同様にrealmScrollまたはそれに含まれるウィジェット上repaint()を呼び出すと、何もしません。

答えて

2

self.realmScroll.setWidgetResizable(True) 
8

を呼び出して試してみてくださいそれは、私はウィジェットのレイアウトとしてレイアウトを置くことによって、間違った道を導くたことが判明しました。

私はもともと試みたが、ちょっとそれは働いているかなり確信している
scrollarea = QScrollArea(parent.widget()) 
layout = QVBoxLayout(scrollarea) 
realmScroll.setWidget(layout.widget()) 

layout.addWidget(QLabel("Test")) 

:これを行うには、実際の方法は、同じくらい簡単です。

これは、スクロールエリアにスクロールバーを追加させる代わりに、レイアウトのアイテムが垂直に縮小されるという問題を追加します。

+0

私はちょうどこれに非常に似た問題がありました。ここのソリューションをご覧ください:http://stackoverflow.com/q/12781407/432913 – will

6

OK、私はちょうどこれで戦ってしまった。スクロール領域(scrollarea-> setWidget)に入り、正しく動作するウィジェットです。それはQVBoxLayoutとラベル/リストウィジェットのペアのリストを含んでいます。それぞれのリストは小さな水平レイアウトになっていて、あなたが望むものはほとんどありません。

重要なことは、サイズヒントとレイアウトに関するQScrollAreaドキュメントセクションを読んで、レイアウト上でsizeContraint QLayout :: SetMinAndMaxSizeを持つビットが必要であることを見つけることでした。

class MappingDisplayWidget : public QWidget 
{ 
    Q_OBJECT 
public: 
    explicit MappingDisplayWidget(QWidget *parent = 0); 
    void addFile(QString name); 
private: 
    QVBoxLayout *m_layout; 
    QMap<QString, QListWidget *> m_mappings; 
}; 


MappingDisplayWidget::MappingDisplayWidget(QWidget *parent) : 
    QWidget(parent) 
{ 
    m_layout = new QVBoxLayout; 
    m_layout->setSizeConstraint(QLayout::SetMinAndMaxSize); 
    setLayout(m_layout); 
} 


void MappingDisplayWidget::addFile(QString name) { 
    if (m_mappings.find(name) == m_mappings.end()) { 
     QWidget *widg = new QWidget; 

     QHBoxLayout *lay = new QHBoxLayout; 
     widg->setLayout(lay); 

     QLabel *nlab = new QLabel(name); 
     lay->addWidget(nlab); 

     QListWidget *list = new QListWidget; 
     lay->addWidget(list); 

     m_layout->addWidget(widg); 

     m_mappings[name] = list; 
    } 
} 

リストウィジェットへのポインタを保持しておくので、後で追加しても問題ありません。

関連する問題