diff --git a/autotests/data/test_nonsquare.png b/autotests/data/test_nonsquare.png new file mode 100644 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@implicitHeight(), qreal(64)); } +void IconItemTest::nonSquareImplicitSize() +{ + QQuickItem *item1 = createIconItem(); + + // Both file:///foo and /foo must behave the same + item1->setProperty("source", QFINDTESTDATA("data/test_nonsquare.png")); + + QCOMPARE(item1->implicitWidth(), qreal(150)); + QCOMPARE(item1->implicitHeight(), qreal(50)); + + QQuickItem *item2 = createIconItem(); + + item2->setProperty("source", QUrl::fromLocalFile(QFINDTESTDATA("data/test_nonsquare.png"))); + + QCOMPARE(item2->implicitWidth(), item1->implicitWidth()); + QCOMPARE(item2->implicitHeight(), item1->implicitHeight()); +} + void IconItemTest::roundToIconSize() { QQuickItem *item = createIconItem(); diff --git a/src/declarativeimports/core/iconitem.cpp b/src/declarativeimports/core/iconitem.cpp --- a/src/declarativeimports/core/iconitem.cpp +++ b/src/declarativeimports/core/iconitem.cpp @@ -150,11 +150,17 @@ } if (!sourceString.isEmpty()) { - //If a url in the form file:// is passed, take the image pointed by that from disk + // If a file:// URL or a absolute path is passed, take the image pointed by that from disk + QString localFile; if (sourceString.startsWith(QLatin1String("file:"))) { - const QUrl url(sourceString); + localFile = QUrl(sourceString).toLocalFile(); + } else if (sourceString.startsWith(QLatin1Char('/'))) { + localFile = sourceString; + } + + if (!localFile.isEmpty()) { m_icon = QIcon(); - m_imageIcon = QImage(url.toLocalFile()); + m_imageIcon = QImage(localFile); m_svgIconName.clear(); delete m_svgIcon; m_svgIcon = 0;