2014-12-06 89 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

相關問題