У меня есть 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 должен оставаться статичным?
Даже если вы задали элемент виджета с помощью «ванили» QLabel, так что не с вашим пользовательским виджетами? – lpapp
@lpapp: Да, даже если я добавлю обычный QLabel, его содержимое удаляется после перемещения. Только если я установил текст '' QListWidgetItem'', он останется после движения. См. Мое редактирование. – vsz