diff --git a/src/widgets/graphicsview/qgridlayoutengine.cpp b/src/widgets/graphicsview/qgridlayoutengine.cpp
index b80612bc4740a0a5aea6e7bed7e653738f719f8a..4f43a0a4ac1c9cfba3677ef70213fadb9c52075f 100644
--- a/src/widgets/graphicsview/qgridlayoutengine.cpp
+++ b/src/widgets/graphicsview/qgridlayoutengine.cpp
@@ -291,7 +291,7 @@ void QGridLayoutRowData::calculateGeometries(int start, int end, qreal targetSiz
 
                     int stretch = stretches[start + i];
                     if (sumStretches == 0) {
-                        if (hasIgnoreFlag) {
+                        if (hasIgnoreFlag || sizes[i] == 0.0) {
                             factors[i] = (stretch < 0) ? 1.0 : 0.0;
                         } else {
                             factors[i] = (stretch < 0) ? sizes[i] : 0.0;
diff --git a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index 41e5ed466c10d719ad3f7deb71f22a5f0599384d..8c8f27d635f5b56feffbc3355600709e01f219bb 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -1884,6 +1884,18 @@ void tst_QGraphicsGridLayout::defaultStretchFactors_data()
                                 << QSizeF(10,10) << QSizeF(10,10) << QSizeF(10,10)
                             );
 
+    QTest::newRow("preferredsizeIsZero") << (ItemList()
+                                    << ItemDesc(0,0)
+                                        .preferredSizeHint(QSizeF(0,10))
+                                    << ItemDesc(0,1)
+                                        .preferredSizeHint(QSizeF(10,10))
+                                        .maxSize(QSizeF(20, 10))
+                                )
+                            << QSizeF(30, 10)
+                            << (SizeList()
+                                << QSizeF(10,10) << QSizeF(20,10)
+                            );
+
     QTest::newRow("ignoreitem01") << (ItemList()
                                     << ItemDesc(0,0)
                                         .preferredSizeHint(QSizeF(10,10))