2014-12-06 11 views
1

У меня есть QListWidget, который заполняется пользовательскими виджетами с использованием setItemWidget.Элементы в QListWidget становятся невидимыми после переупорядочения

Эти элементы пользовательского списка полностью статичны, у них просто есть набор меток с различными текстами и изображениями. Мой QListWidget отображается правильно. Я разрешаю переупорядочивание перетаскивания, и после перемещения элемента в другую позицию он становится невидимым. Он не исчезает, потому что он занимает место на дисплее, я даже могу щелкнуть по нему, он просто полностью невидим, как будто все ярлыки внутри него внезапно стали пустыми. Интересно, что если я установил цвет фона для этих виджетов, пользовательский цвет фона не будет очищен, а только содержимое.

Если я ввожу общие QListWidgetItem s в QListQidget, они остаются видимыми даже после движения.

Что заставляет пользовательские виджеты стать пустыми и как я могу остановить это?

Пример.

QListWidgetItem *item; 
MyCustomWidget *custom; 

item = new QListWidgetItem(); 
item->setText("This will remain visible"); 
listWidget->addItem(item); 

item = new QListWidgetItem(); 
custom = new MyCustomWidget(); 
custom->setName(QString("This will vanish")); // this will add text to one of the labels inside it. 
listWidget->addItem(item); 
item->setSizeHint(QSize(50,65)); 
listWidget->setItemWidget(item, custom); 

После перемещения элементов с помощью мыши, элементы, добавленные с помощью «нормальных» QListWidgetItems сохраняют свое содержимое, в то время как те, которые были добавлены через setItemWidget есть их содержимое исчезают.

Редактировать

Даже если мой пользовательский виджет просто QLabel, его содержимое исчезли после его перемещения.

QLabel *label; 
item = new QListWidgetItem(); 
label = new QLabel(); 
label->setText("This label will vanish"); 
listWidget->addItem(item); 
listWidget->setItemWidget(item, label); 

Как и пользовательский виджет, его размер и цвет фона, если они установлены, остаются неизменными, поэтому элемент не удаляется. Очищается только содержимое метки. Если я устанавливаю фон для самой метки (через setStyleSheet), она очищается. Если я устанавливаю фон для самого элемента, он остается.

Edit 2

кажется набор виджетов в setItemWidget будут разъединены после того, как движение.

Я создал кнопку, которая отображает qDebug() << listWidget->itemWidget(listWidget->item(0)); при нажатии. Если у меня есть пользовательские виджеты или для простоты, QLabel s как мои предметы, перед перемещением их отобразится QLabel(0x8b41fd8), после этого движения отображается QObject(0x0). Кажется, что виджет, прикрепленный к элементу, удален.

В manual для setItemWidget указано, что «эта функция должна использоваться только для отображения статического содержимого вместо элемента виджета списка». Я думал, что это означает, что мы не должны ставить в них кнопки, динамически изменяющиеся виджеты и т. Д., Но теперь кажется, что «статический контент» означает, что весь QListWidget должен оставаться статичным?

+0

Даже если вы задали элемент виджета с помощью «ванили» QLabel, так что не с вашим пользовательским виджетами? – lpapp

+0

@lpapp: Да, даже если я добавлю обычный QLabel, его содержимое удаляется после перемещения. Только если я установил текст '' QListWidgetItem'', он останется после движения. См. Мое редактирование. – vsz

ответ

1

в них, но теперь кажется, что «статический контент» означает, что весь QListWidget должен оставаться статическим?

Да, continue reading the next sentence. Это даст понять, что вам нужно для всего этого.t

Эта функция должна использоваться только для отображения статического содержимого в месте элемента виджета списка. Если вы хотите отобразить собственный динамический контент или реализовать собственный виджет редактора, вместо этого используйте QListView и подкласс QItemDelegate.

+0

Да, я прочитал его, но мне было непонятно, что на самом деле означает «динамический контент». Вот почему я захотел сначала поэкспериментировать с QListWidget, который, кажется, намного проще в использовании, чем модельное представление с вручную написанными подклассами – vsz

+0

@vsz: проверьте «void QListWidget :: dropEvent (событие QDropEvent *)) {' реализация, если вы хочу убедиться. – lpapp

+0

@vsz: это разрешено сейчас? – lpapp