/*! \reimp */ QSize QWidgetItem::maximumSize() const { if (isEmpty()) { return QSize(0, 0); } else { return !wid->testAttribute(Qt::WA_LayoutUsesWidgetRect) ? toLayoutItemSize(wid->d_func(), qSmartMaxSize(this, align)) : qSmartMaxSize(this, align); } }
void QScrollAreaPrivate::updateScrollBars() { Q_Q(QScrollArea); if (!widget) return; QSize p = viewport->size(); QSize m = q->maximumViewportSize(); QSize min = qSmartMinSize(widget); QSize max = qSmartMaxSize(widget); if (resizable) { if ((widget->layout() ? widget->layout()->hasHeightForWidth() : widget->sizePolicy().hasHeightForWidth())) { QSize p_hfw = p.expandedTo(min).boundedTo(max); int h = widget->heightForWidth( p_hfw.width() ); min = QSize(p_hfw.width(), qMax(p_hfw.height(), h)); } } if ((resizable && m.expandedTo(min) == m && m.boundedTo(max) == m) || (!resizable && m.expandedTo(widget->size()) == m)) p = m; // no scroll bars needed if (resizable) widget->resize(p.expandedTo(min).boundedTo(max)); QSize v = widget->size(); hbar->setRange(0, v.width() - p.width()); hbar->setPageStep(p.width()); vbar->setRange(0, v.height() - p.height()); vbar->setPageStep(p.height()); updateWidgetPosition(); }
Q_GUI_EXPORT QSize qSmartMaxSize(const QWidgetItem *i, Qt::Alignment align) { QWidget *w = ((QWidgetItem*)i)->widget(); return qSmartMaxSize(w->sizeHint().expandedTo(w->minimumSizeHint()), w->minimumSize(), w->maximumSize(), w->sizePolicy(), align); }
Q_WIDGETS_EXPORT QSize qSmartMaxSize(const QWidgetItem *i, Qt::Alignment align) { QWidget *w = const_cast<QWidgetItem*>(i)->widget(); return qSmartMaxSize(w->sizeHint().expandedTo(w->minimumSizeHint()), w->minimumSize(), w->maximumSize(), w->sizePolicy(), align); }
void QScrollAreaPrivate::updateScrollBars() { Q_Q(QScrollArea); if (!widget) return; QSize p = viewport->size(); QSize m = q->maximumViewportSize(); QSize min = qSmartMinSize(widget); QSize max = qSmartMaxSize(widget); if ((resizable && m.expandedTo(min) == m && m.boundedTo(max) == m) || (!resizable && m.expandedTo(widget->size()) == m)) p = m; // no scroll bars needed if (resizable) widget->resize(p.expandedTo(min).boundedTo(max)); QSize v = widget->size(); hbar->setRange(0, v.width() - p.width()); hbar->setPageStep(p.width()); vbar->setRange(0, v.height() - p.height()); vbar->setPageStep(p.height()); updateWidgetPosition(); }
void tst_QLayout::smartMaxSize() { QVector<int> expectedWidths; QFile f(QFINDTESTDATA("baseline/smartmaxsize")); QCOMPARE(f.open(QIODevice::ReadOnly | QIODevice::Text), true); QTextStream stream(&f); while(!stream.atEnd()) { QString line = stream.readLine(200); expectedWidths.append(line.section(QLatin1Char(' '), 6, -1, QString::SectionSkipEmpty).toInt()); } f.close(); int sizeCombinations[] = { 0, 10, 20, QWIDGETSIZE_MAX}; QSizePolicy::Policy policies[] = { QSizePolicy::Fixed, QSizePolicy::Minimum, QSizePolicy::Maximum, QSizePolicy::Preferred, QSizePolicy::Expanding, QSizePolicy::MinimumExpanding, QSizePolicy::Ignored }; Qt::Alignment alignments[] = { 0, Qt::AlignLeft, Qt::AlignRight, Qt::AlignHCenter }; int expectedIndex = 0; int regressionCount = 0; for (size_t p = 0; p < sizeof(policies)/sizeof(QSizePolicy::Policy); ++p) { QSizePolicy sizePolicy; sizePolicy.setHorizontalPolicy(policies[p]); for (size_t min = 0; min < sizeof(sizeCombinations)/sizeof(int); ++min) { int minSize = sizeCombinations[min]; for (size_t max = 0; max < sizeof(sizeCombinations)/sizeof(int); ++max) { int maxSize = sizeCombinations[max]; for (size_t sh = 0; sh < sizeof(sizeCombinations)/sizeof(int); ++sh) { int sizeHint = sizeCombinations[sh]; for (size_t a = 0; a < sizeof(alignments)/sizeof(int); ++a) { Qt::Alignment align = alignments[a]; QSize sz = qSmartMaxSize(QSize(sizeHint, 1), QSize(minSize, 1), QSize(maxSize, 1), sizePolicy, align); int width = sz.width(); int expectedWidth = expectedWidths[expectedIndex]; if (width != expectedWidth) { qDebug() << "error at index" << expectedIndex << ":" << sizePolicy.horizontalPolicy() << align << minSize << sizeHint << maxSize << width; ++regressionCount; } ++expectedIndex; } } } } } QCOMPARE(regressionCount, 0); }
Q_EXPORT QSize qSmartMaxSize( QWidget *w, int align ) { QWidgetItem item( w ); return qSmartMaxSize( &item, align ); }
Q_GUI_EXPORT QSize qSmartMaxSize(const QWidget *w, Qt::Alignment align) { return qSmartMaxSize(w->sizeHint().expandedTo(w->minimumSizeHint()), w->minimumSize(), w->maximumSize(), w->sizePolicy(), align); }