QListWidget 中的项目在重新排序后变得不可见

vsz*_*vsz 5 c++ qt qlistwidget qtgui qlistwidgetitem

我有一个QListWidget由自定义小部件使用setItemWidget.

这些自定义列表项是完全静态的,它们只有一堆带有各种文本和图像的标签。我的 QListWidget 显示正确。我允许拖放重新排序,当我将项目移动到不同位置后,它就会变得不可见。它不会消失,因为它占用了显示屏的空间,我什至可以点击它,它只是完全不可见,就好像它里面的所有标签突然变成了空白。有趣的是,如果我为这些小部件设置背景颜色,自定义背景颜色不会被清除,只会清除内容。

如果我将泛型插入QListWidgetItem到 中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);
Run Code Online (Sandbox Code Playgroud)

用鼠标移动项目后,通过“普通”QListWidgetItems 添加的项目保留其内容,而通过“普通”QListWidgetItems 添加的项目setItemWidget其内容消失。

编辑

即使我的自定义小部件只是一个QLabel,其内容在移动后也会消失。

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

与自定义小部件一样,其大小和背景颜色(如果设置)将保持不变,因此不会删除该项目。仅清除标签的内容。如果我为标签本身设置背景(通过 setStyleSheet),它就会被清除。如果我为项目本身设置背景,它就会保留。

编辑2

看来设置的WidgetsetItemWidget在一次移动后就会解耦。

我创建了一个按钮,qDebug() << listWidget->itemWidget(listWidget->item(0));按下时会显示。如果我有自定义小部件,或者为了简单起见,QLabel将其作为我的项目,在移动它们之前显示QLabel(0x8b41fd8),在移动之后显示QObject(0x0)。似乎附加到该项目的小部件已被删除。

手册指出“此功能setItemWidget只能用于在列表小部件项目的位置显示静态内容”。我认为这意味着我们不应该在其中放置可按下的按钮、动态更改的小部件等,但现在看来“静态内容”意味着整个 QListWidget 本身必须保持静态?

lpa*_*app 1

在其中,但现在看来“静态内容”意味着整个QListWidget本身必须保持静态?

是的,继续阅读下一句话。这会让你清楚地知道这一切需要什么。

此函数只能用于在列表小部件项目的位置显示静态内容。如果您想显示自定义动态内容或实现自定义编辑器小部件,请改用 QListView 和 QItemDelegate 子类。