2009-06-09 63 views
0

我試圖讓QTableView的單元看起來像3D可點擊的按鈕。所以當你點擊一個單元格時,這個按鈕看起來就是按下了。 大家似乎認爲我只是想改變顏色,我需要顯示一個正常按鈕的圖像和一個看起來像三維的按鈕。使QTableView的單元格有向上和向下按鈕的狀態在Qt中的最佳方式是什麼?

我已經通過調用QTableView::setItemDelegate()和適當的ItemDelegate來完成此操作,該操作會在單擊單元格時更改單元格的背景。然而,我堅持這一點,因爲我想要一些單元格根據它們包含的數據是不同的彩色按鈕。所以一個數字較小的單元格會是一個紅色按鈕,點擊時它也是紅色的,而其他單元格會是不同的顏色。

我可以用TableModel設置按鈕的顏色,但是一旦點擊了按鈕,ItemDelegate就沒有辦法知道它應該與其他顏色不同。你怎麼能鏈接這兩個,所以ItemDelegate知道它應該是什麼顏色?

此外,是否有一個更好的方法使單元格看起來像按鈕?

回答

1

您可以從ItemDelegatepaint()方法中調用QModelIndex::model(),因爲它具有QModelIndex參數。這會爲您提供數據的TableModel,您可以通過編程方式決定單元格按鈕的顏色。

但是,這仍然沒有我希望的那麼優雅。有沒有人知道更好的方式來改變表格單元格的外觀,當在向上和向下按鈕推狀態?

+0

剛纔提出這個問題後就明白了這一點。 – Neil 2009-06-09 15:18:41

0

您不能得到表格單元格行的ID /行數,然後根據您可能具有的顏色表檢查它,並相應地設置顏色?我不確定我是否理解你的問題。

+0

是的,我想到了,但你必須有一個單獨的顏色表,這是不是很優雅。我正在尋找更好的方法。 – Neil 2009-06-09 15:13:52

+0

另外我需要按鈕圖像,而不是顏色。沒有辦法設置按鈕圖像,並使它像所有顏色一樣工作。 – Neil 2009-06-25 16:13:48

0

爲背景顏色指定數據角色,並在項目代理中詢問模型索引背景顏色是什麼(使用data(bg_color_role)或類似的東西)。然後,在您的模型中,您需要確保數據函數爲bg_color_role返回適合所建模數據的顏色。

+0

你可以用圖像做到這一點嗎?我需要爲單元格的向下和向上狀態設置3D按鈕圖像。 – Neil 2009-06-22 17:11:24

1

爲什麼你不問索引的背景顏色。

事情是這樣的......

QStyleOptionToolButton buttonOption; 
const QStyleOptionViewItemV4& optionV4 = dynamic_cast<QStyleOptionViewItemV4&>(option); 
//... 
buttonOption.palette.setBrush(QPalette::Button, index.data(Qt::BackgroundColorRole)); 
//... 

我也覺得它在Qt的一個錯誤,它一定是...

// model code 
if(role==Qt::BackgroundColorRole) 
    return qvariant_cast<QBrush>(QBrush(Qt::red)); 

// delegate code 
buttonOption.palette.setBrush(QPalette::Button, optionV4.backgroundBrush); 

因爲optionV4.backgroundBrus h是正確的sizeHint方法,但在paint方法中無效。我現在看到爲什麼sizeHint應該有背景畫筆和paint方法沒有。我會把它報告給諾基亞。

編輯:

看起來我是對的,它的錯誤< Qt4.5。
QStyleOptionViewItemV4 doesn't copy the icon and backgroundBrush

+0

我需要使用向上和向下狀態圖像來完成此操作,而不僅僅是背景顏色。 – Neil 2009-06-22 17:11:59

0

做到這一點的方法是使用QModelIndex的數據的方法的對象你上了漆的方法,並要求一個特定的角色(如果定義了一個自定義模式,您可以添加自己的角色,並給你需要的信息給這些角色的代表)。

TimW,我想你必須在調用initStyleOption之前填充QStyleOptionViewItemV4信息。

0

我不確定背景圖片的需求來自何處。如果你想在細胞看起來像QPushButton S,你應該從QItemDelegate繼承,並實現paint()使用QStyle吸引你一個QPushButton,是這樣的:

QStyleOptionButton opt; 
// fill 'opt' from the information from the model, and the style option that's passed in 
style()->drawControl(QStyle::CE_PushButton, &opt, painter); 
0

您是否嘗試過使用自定義樣式表?

您可以將相同的樣式表應用於每個單元格,然後更改背景圖片/樣式以根據是否選中來繪製3D按鈕圖片。

相關問題