重新排序后,QListWidget中的项不可见

时间:2014-12-06 13:41:48

标签: c++ qt qtgui qlistwidget 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);

使用鼠标移动项目后,通过" normal"添加项目。 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));。如果我有自定义小部件,或者为了简单起见,QLabel作为我的项目,在移动它们之前显示QLabel(0x8b41fd8),在移动后显示QObject(0x0)setItemWidget。似乎附加到项目的小部件被删除。

{{1}}的{​​{3}}表示&#34;此功能仅用于在列表小部件项目的位置显示静态内容。&#34;我认为这意味着我们不应该在其中放置可推动的按钮,动态更改小部件等,但现在它似乎是静态内容&#34;意味着整个QListWidget本身必须保持静态?

1 个答案:

答案 0 :(得分:1)

  

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

是的,continue reading the next sentence。这将清楚地说明你需要什么.t

  

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