2014-12-06 102 views
1

我有一个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本身必须保持静态?

+0

即使您使用“vanilla”QLabel设置项目窗口小部件,那么您的自定义窗口小部件又没有? – lpapp 2014-12-06 14:04:54

+0

@lpapp:是的,即使我添加了一个正常的QLabel,它的内容在移动后被移除。只有当我设置'QListWidgetItem'本身的文本时,它才会在移动后保留。看我的编辑。 – vsz 2014-12-06 14:16:58

回答

1

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

是,continue reading the next sentence。这将明确你需要什么。t

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

+0

是的,我读过它,但我不清楚“动态内容”的真正含义。这就是为什么我想先用QListWidget,这似乎是更容易比模型 - 视图与手工编写的子类 – vsz 2014-12-06 16:52:59

+0

@vsz使用试验:检查'无效QListWidget :: dropEvent(QDropEvent *事件){'实现,如果你想要确认。 – lpapp 2014-12-06 17:16:19

+0

@vsz:现在解决了吗? – lpapp 2014-12-08 02:15:58