我有一个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),它将被清除。如果我为项目本身设置了背景,它仍然存在。
编辑2
看来控件在setItemWidget
所设定的运动后会被分离。
我创建了一个按钮,按下后会显示qDebug() << listWidget->itemWidget(listWidget->item(0));
。如果我有自定义小部件,或者为了简单起见,请将QLabel
作为我的项目,然后在移动它们之前显示QLabel(0x8b41fd8)
,移动后显示QObject(0x0)
。看起来附加到该项目的小部件被删除。
manual对于setItemWidget
指出“此函数只能用于在列表窗口小部件项目的位置显示静态内容”。我认为这意味着我们不应该在其中放置可推动的按钮,动态更改小部件等,但现在看起来“静态内容”意味着整个QListWidget本身必须保持静态?
即使您使用“vanilla”QLabel设置项目窗口小部件,那么您的自定义窗口小部件又没有? – lpapp 2014-12-06 14:04:54
@lpapp:是的,即使我添加了一个正常的QLabel,它的内容在移动后被移除。只有当我设置'QListWidgetItem'本身的文本时,它才会在移动后保留。看我的编辑。 – vsz 2014-12-06 14:16:58