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

Posted

技术标签:

【中文标题】QListWidget 中的项目在重新排序后变为不可见【英文标题】:Items in a QListWidget turn invisible after reordering 【发布时间】:2014-12-06 13:41:48 【问题描述】:

我有一个QListWidget,它由使用setItemWidget 的自定义小部件填充。

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

如果我将通用QListWidgetItems 插入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),它会被清除。如果我为项目本身设置背景,它仍然存在。

编辑 2

setItemWidget 中设置的 Widget 似乎在移动后会解耦。

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

setItemWidget 的 manual 声明“此函数仅应用于显示静态内容以代替列表小部件项。”我认为这意味着我们不应该在其中放置可按下的按钮、动态更改的小部件等,但现在看来“静态内容”意味着整个 QListWidget 本身必须保持静态?

【问题讨论】:

即使您使用“香草”QLabel 设置项目小部件,而不是使用您的自定义小部件? @lpapp :是的,即使我添加了一个普通的 QLabel,它的内容在移动后也会被删除。只有当我设置 QListWidgetItem 本身的文本时,它才会在移动后保留。查看我的编辑。 【参考方案1】:

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

是的,continue reading the next sentence。这将清楚您需要什么。t

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

【讨论】:

是的,我读过它,但我不清楚“动态内容”的真正含义。这就是为什么我想首先尝试使用 QListWidget,它似乎比手动编写子类的模型视图更容易使用 @vsz:如果您想确定,请检查void QListWidget::dropEvent(QDropEvent *event) 实现。 我放弃了这条路线,改用 QStandardItemModel 和自定义子类。

以上是关于QListWidget 中的项目在重新排序后变为不可见的主要内容,如果未能解决你的问题,请参考以下文章

按数字对 QListWidget 进行排序

如何在 QListWidget 中将项目列为组

QListWidget 向下滚动列表后拖动

两列布局,无需JavaScript即可重新排序项目

重新排序 TableView 和节标题高度变为零时数据源不更新

在PyQt5中的QTreeWidget和QListWidget之间拖动项目?