我有一個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