2011-11-15 25 views
5

我有一個多項選擇啓用QListView與項目委託(QStyledItemDelegate)我用於設置項目的大小和做自定義畫圖。我的要求是非常簡單的:QTListView與項目委託 - 對選定項目更高的項目行

  1. 行高30非選定的項目
  2. 行高60選定項目

不能得到這個工作。

使用sizeHint我QStyledItemDelegate

if (option.state & QStyle::State_Selected) 
{ 
    return QSize(100,60); /// <<<<------ NEVER REACHED 
} 
else 
{ 
    return QSize(100,30); 
} 

狀態永遠不會選擇這是奇怪的,因爲同樣的if語句完全適用於在同一類的繪畫方法,選擇行和非選擇的區分嘗試行爲不同的油漆背景。

然後我嘗試別的東西

我做出了選擇模型(QItemSelectionModel)對我的委託sizeHint方法訪問。使用這個我可以成功查詢是否選擇了sizehint被調用的行,並且我返回了正確的大小。但是現在只有繪圖是以正確的變量大小完成的。對於選定的項目,繪圖現在的高度爲60,這是正確的,但它與其下面的項目重疊。換句話說:新大小提示大小僅用於DRAWING,但不用於實際使QListView項目更高。看起來有一個缺少調用來「更新」listView,其中一個項目的大小發生了變化。我不需要只畫高一點的東西,我需要的項目爲爲此目的可以高一些

似乎只有初始化時,sizeHint纔會在開始時對項目高度產生影響。如果你突然爲sizeHint中的某個項目返回更高的高度值 - 它不會增加listview以適應新的高度。

一個有趣的現象:

如果我設置setResizeMode(而QListView ::調整)對我而QListView,略有調整大小的控制將觸發所有項目的重新計算,固定的大小實際選定的項目(例如總是以正確的高度完成)不會級聯在下方的項目上,因爲項目高度現在是正確的。這是我需要做的選擇變化,導致「重新計算」像QLiustView :: Adjust原因。我怎麼做?

我現在正在做的事很醜陋,我很積極,這不是做這件事的方法,但我沒有別的選擇。我接觸到選擇模型 - 監聽選擇變化,當它們來時,我將QlistView的高度調整爲1,然後回到原始大小。這會生成一個項目大小的重新計算(setResizeMode(QListView :: Adjust)),一切看起來都正常,我只是因爲必須這樣做而感到噁心 - 是否沒有更好的方法來讓項目重新計算它們的高度NOT通過僞造QListView的大小?

回答

1

證實頂部諾基亞Qt開發人員 - 我這樣做顯然是黑客是讓這件事做的唯一方法:

我現在正在做的是醜,我敢肯定這是沒有辦法做到這一點, 但我沒有其他的選擇。我喜歡選擇 模型 - 監聽選擇變化,當他們來的時候,我將QlistView的高度調整爲 ,然後回到原始大小。這 生成項目的重新計算尺寸 (setResizeMode(而QListView ::調整),一切看起來和正常工作