
如果我們想動態的更改item的前景色(例如值大于零顯示紅色,小于零顯示綠色),并且選中后文字顏色不變(這個是我想實現的,其實就是模仿一般的股票價格圖表),怎么辦呢? 首先在添加或者修改item的時候,可以使用:
model->item(row, column)->setForeground(QBrush(QColor(255, 0, 0))); //把表格的item的文字顏色設置為紅色
但是只這樣還是不夠的,這樣只能保證在不選中的情況下顯示為紅色, 若不做其他設置,選中后item的顏色照樣變成白色的了。
對此我找到了使用代理的方法,使選中后的文字顏色和選中前的文字顏色一致(也可以靈活修改),效果如下圖,代碼隨后。
//黃色的那行為選中行
- //委托(代理)
- class ItemDelegate : public QItemDelegate
- {
- Q_OBJECT
- public:
- ItemDelegate()
- {
- }
- void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
- {
- QStyleOptionViewItem viewOption(option);
- //高亮顯示與普通顯示時的前景色一致(即選中行和為選中時候的文字顏色一樣)
- viewOption.palette.setColor(QPalette::HighlightedText, index.data(Qt::ForegroundRole).value<QColor>());
- QItemDelegate::paint(painter, viewOption, index);
- }
- };
- //委托(代理)
- class ItemDelegate : public QItemDelegate
- {
- Q_OBJECT
- public:
- ItemDelegate()
- {
- }
- void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
- {
- QStyleOptionViewItem viewOption(option);
- //高亮顯示與普通顯示時的前景色一致(即選中行和為選中時候的文字顏色一樣)
- viewOption.palette.setColor(QPalette::HighlightedText, index.data(Qt::ForegroundRole).value<QColor>());
- QItemDelegate::paint(painter, viewOption, index);
- }
- };
- view = new QTableView;
- model = new QStandardItemModel;
- view->setModel(model);
- view->setItemDelegate(new ItemDelegate);
- view = new QTableView;
- model = new QStandardItemModel;
- view->setModel(model);
- view->setItemDelegate(new ItemDelegate);
- if (strList[2].toDouble() >= strList[3].toDouble())
- model->item(row, 2)->setForeground(QBrush(QColor(255, 0, 0)));
- else
- model->item(row, 2)->setForeground(QBrush(QColor(0, 127, 0)));
- if (strList[4].toDouble() >= strList[3].toDouble())
- model->item(row, 4)->setForeground(QBrush(QColor(255, 0, 0)));
- else
- model->item(row, 4)->setForeground(QBrush(QColor(0, 127, 0)));
- if (strList[2].toDouble() >= strList[3].toDouble())
- model->item(row, 2)->setForeground(QBrush(QColor(255, 0, 0)));
- else
- model->item(row, 2)->setForeground(QBrush(QColor(0, 127, 0)));
- if (strList[4].toDouble() >= strList[3].toDouble())
- model->item(row, 4)->setForeground(QBrush(QColor(255, 0, 0)));
- else
- model->item(row, 4)->setForeground(QBrush(QColor(0, 127, 0)));