diff options
author | Gabriel de Dietrich <gabriel.dietrich-de@nokia.com> | 2010-01-06 14:36:21 (GMT) |
---|---|---|
committer | Gabriel de Dietrich <gabriel.dietrich-de@nokia.com> | 2010-01-06 15:05:12 (GMT) |
commit | 94759a0ed565b21c8dbfb4b12bfe6064f156b410 (patch) | |
tree | 617a60355fa612c0ca2a8a07cf5279eb6fc28eb0 | |
parent | 092f2014cf81d9f58670ede7d381022dd6903cbb (diff) | |
download | Qt-94759a0ed565b21c8dbfb4b12bfe6064f156b410.zip Qt-94759a0ed565b21c8dbfb4b12bfe6064f156b410.tar.gz Qt-94759a0ed565b21c8dbfb4b12bfe6064f156b410.tar.bz2 |
QBoxLayout::setGeometry would not respect the widget min/max width
When calling heightforWidth after a geometry change, the width actually used
could be outside the widget's width bounds. The height could then be smaller
than needed to fit the widget's contents resulting in a clipped widget being
drawn. Auto-test included.
Reviewed-by: Olivier
Task-number: QTBUG-7103
-rw-r--r-- | src/gui/kernel/qboxlayout.cpp | 6 | ||||
-rw-r--r-- | tests/auto/qboxlayout/tst_qboxlayout.cpp | 27 |
2 files changed, 31 insertions, 2 deletions
diff --git a/src/gui/kernel/qboxlayout.cpp b/src/gui/kernel/qboxlayout.cpp index d965933..fd16861 100644 --- a/src/gui/kernel/qboxlayout.cpp +++ b/src/gui/kernel/qboxlayout.cpp @@ -830,9 +830,11 @@ void QBoxLayout::setGeometry(const QRect &r) if (d->hasHfw && !horz(d->dir)) { for (int i = 0; i < n; i++) { QBoxLayoutItem *box = d->list.at(i); - if (box->item->hasHeightForWidth()) + if (box->item->hasHeightForWidth()) { + int width = qBound(box->item->minimumSize().width(), s.width(), box->item->maximumSize().width()); a[i].sizeHint = a[i].minimumSize = - box->item->heightForWidth(s.width()); + box->item->heightForWidth(width); + } } } diff --git a/tests/auto/qboxlayout/tst_qboxlayout.cpp b/tests/auto/qboxlayout/tst_qboxlayout.cpp index 8887288..48235e8 100644 --- a/tests/auto/qboxlayout/tst_qboxlayout.cpp +++ b/tests/auto/qboxlayout/tst_qboxlayout.cpp @@ -66,6 +66,8 @@ private slots: void sizeConstraints(); void setGeometry(); void setStyleShouldChangeSpacing(); + + void taskQTBUG_7103_minMaxWidthNotRespected(); }; class CustomLayoutStyle : public QWindowsStyle @@ -246,6 +248,31 @@ void tst_QBoxLayout::setStyleShouldChangeSpacing() delete style2; } +void tst_QBoxLayout::taskQTBUG_7103_minMaxWidthNotRespected() +{ + QLabel *label = new QLabel("Qt uses standard C++, but makes extensive use of the C pre-processor to enrich the language. Qt can also be used in several other programming languages via language bindings. It runs on all major platforms, and has extensive internationalization support. Non-GUI features include SQL database access, XML parsing, thread management, network support and a unified cross-platform API for file handling."); + label->setWordWrap(true); + label->setFixedWidth(200); + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(label); + layout->addSpacerItem(new QSpacerItem(1, 1, QSizePolicy::Fixed, QSizePolicy::Expanding)); + + QWidget widget; + widget.setLayout(layout); + widget.show(); + QTest::qWaitForWindowShown(&widget); + + int height = label->height(); + + QRect g = widget.geometry(); + g.setWidth(600); + widget.setGeometry(g); + + QTest::qWait(50); + + QCOMPARE(label->height(), height); +} QTEST_MAIN(tst_QBoxLayout) #include "tst_qboxlayout.moc" |