2008-11-13 69 views
4

我正在使用QTableWidget來顯示多行。有些行應反映一個錯誤,它們的文本顏色更改:在QTableWidget中,更改所選行的文本顏色

行中,反映沒有顯示有一個默認顏色(白色背景上的黑色文本在我的電腦上)錯誤。
反映出現錯誤的行以紅色文本顏色(我的計算機上的白色背景上的紅色文本)顯示。

只要沒有選擇,這一切都很好。只要選擇了一行,不管未選中的文本顏色如何,在藍色背景上,文本顏色總是會變成白色(在我的計算機上)。

這是我想改變得到以下:
當選擇了行,如果該行是反映沒有錯誤,我想它白字藍色背景上顯示(默認行爲)。
如果該行反映了錯誤並被選中,我希望它在藍色背景上顯示爲紅色文本。

到目前爲止,我只能夠改變整個QTableWidget的,選擇的顏色是不是我想要的!

+0

你目前用來設置文本顏色的代碼是什麼樣的? – 2009-06-18 12:52:52

回答

7

回答我,這裏是我落得這樣做:一個委託。

此代表將檢查項目的前景色角色。如果此前景色不是調色板的默認WindowText顏色,則表示設置了特定顏色,並且此特定顏色用於突出顯示的文本顏色。

我不知道這是非常強大的,但至少它是在Windows工作正常。

class MyItemDelegate: public QItemDelegate 
{ 
public: 
    MyItemDelegate(QObject* pParent = 0) : QItemDelegate(pParent) 
    { 
    } 

    void paint(QPainter* pPainter, const QStyleOptionViewItem& rOption, const QModelIndex& rIndex) const 
    { 
    QStyleOptionViewItem ViewOption(rOption); 

    QColor ItemForegroundColor = rIndex.data(Qt::ForegroundRole).value<QColor>(); 
    if (ItemForegroundColor.isValid()) 
    { 
     if (ItemForegroundColor != rOption.palette.color(QPalette::WindowText)) 
     { 
     ViewOption.palette.setColor(QPalette::HighlightedText, ItemForegroundColor); 
     } 
    } 
    QItemDelegate::paint(pPainter, ViewOption, rIndex); 
} 
}; 

這裏是如何使用它:

QTableWidget* pTable = new QTableWidget(...); 
pTable->setItemDelegate(new MyItemDelegate(this)); 
0

你可以,當然,從表格部件繼承和覆蓋油漆事件,但我不認爲這是你想要做什麼。

相反,應該使用QAbstractItemDelegate功能。您可以創建一個總是用於錯誤行,並將錯誤行設置爲使用該委託,或者創建一個知道如何繪製兩種類型行的常規行。第二種方法是我會推薦的。然後,您的委託適當繪製行,即使對於選定的行。

1

它看起來不錯,但你可能想看看QStyleOption文檔也可以告訴你閹羊繪製的項目被選中與否,你不必看着繪製顏色來做到這一點。我可能會給模型類一個用戶角色,返回數據是否有效,然後根據這個做出顏色決定。即rIndex.data(ValidRole)會返回此索引處的數據是否有效。

我不知道你試過了BackgroundRole重寫數據並返回一個自定義顏色,如果你改變顏色有

0

你可以使用例如Qt的可能做正確的事一個proxy model爲此您返回一個不同的顏色,如果你有一個特定的modelindex錯誤;

QVariant MySortFilterProxyModel::data(const QModelIndex & index, int role = Qt::DisplayRole) { 
     // assuming error state and modelindex row match 
     if (role==Qt::BackgroundRole) 
     return Qt::red; 
    } 
1

什麼你想要做的就是連接由QTableWidget的的QItemSelectionModel發射到槽selectionChanged()信號,說OnTableSelectionChanged()。在你的插槽中,你可以使用QStyleSheets設置選擇顏色,如下所示:

if (noError) 
{ 
    pTable->setStyleSheet("QTableView {selection-background-color: #000000; selection-color: #FFFFFF;}"); 
} 
else 
{ 
    pTable->setStyleSheet("QTableView {selection-background-color: #FF0000; selection-color: #0000FF;}"); 
}