summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/itemviews/qstyleditemdelegate.cpp4
-rw-r--r--src/widgets/styles/qcommonstyle.cpp19
-rw-r--r--tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp17
3 files changed, 35 insertions, 5 deletions
diff --git a/src/widgets/itemviews/qstyleditemdelegate.cpp b/src/widgets/itemviews/qstyleditemdelegate.cpp
index 7442fc58c8..038b0bdcd0 100644
--- a/src/widgets/itemviews/qstyleditemdelegate.cpp
+++ b/src/widgets/itemviews/qstyleditemdelegate.cpp
@@ -285,6 +285,10 @@ void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option,
switch (value->userType()) {
case QMetaType::QIcon: {
option->icon = qvariant_cast<QIcon>(*value);
+ if (option->icon.isNull()) {
+ option->features &= ~QStyleOptionViewItem::HasDecoration;
+ break;
+ }
QIcon::Mode mode;
if (!(option->state & QStyle::State_Enabled))
mode = QIcon::Disabled;
diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp
index c7dee0549e..1af0038dc2 100644
--- a/src/widgets/styles/qcommonstyle.cpp
+++ b/src/widgets/styles/qcommonstyle.cpp
@@ -941,12 +941,21 @@ QSize QCommonStylePrivate::viewItemSize(const QStyleOptionViewItem *option, int
break;
}
case QStyleOptionViewItem::Top:
- case QStyleOptionViewItem::Bottom:
- if (wrapText)
- bounds.setWidth(bounds.isValid() ? bounds.width() - 2 * textMargin : option->decorationSize.width());
- else
- bounds.setWidth(QFIXED_MAX);
+ case QStyleOptionViewItem::Bottom: {
+ int width;
+ if (wrapText) {
+ if (bounds.isValid())
+ width = bounds.width() - 2 * textMargin;
+ else if (option->features & QStyleOptionViewItem::HasDecoration)
+ width = option->decorationSize.width();
+ else
+ width = 0;
+ } else {
+ width = QFIXED_MAX;
+ }
+ bounds.setWidth(width);
break;
+ }
default:
break;
}
diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
index 3c43b3fcd5..c7bd1c934a 100644
--- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
+++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
@@ -156,6 +156,7 @@ private slots:
void spacingWithWordWrap();
void scrollOnRemove_data();
void scrollOnRemove();
+ void wordWrapNullIcon();
};
// Testing get/set functions
@@ -3174,6 +3175,22 @@ void tst_QListView::scrollOnRemove()
QTRY_COMPARE(view.verticalScrollBar()->value(), item25Position);
}
+void tst_QListView::wordWrapNullIcon()
+{
+ QListView listView;
+ listView.setViewMode(QListView::IconMode);
+ listView.setWrapping(true);
+ listView.setWordWrap(true);
+ listView.setFixedSize(QSize(100, 500));
+
+ QStandardItemModel model;
+ QStandardItem *item = new QStandardItem(QIcon(), "This is a long text for word wrapping Item_");
+ model.appendRow(item);
+ listView.setModel(&model);
+
+ listView.indexAt(QPoint(0, 0));
+}
+
QTEST_MAIN(tst_QListView)
#include "tst_qlistview.moc"