我正在使用QTableWidget来显示多行。其中一些行应反映错误并更改其文本颜色:
显示没有错误的行以默认颜色显示(计算机上白色背景上的黑色文本) 显示有错误的行以红色文本颜色显示(在我的计算机上的白色背景上是红色文本)。
只要没有选择,这一切都很好。选择行后,无论未选择的文本颜色如何,文本颜色在蓝色背景上始终为白色(在我的计算机上)。
我想改变以获得以下内容:
选择行时,如果行反映没有错误,我希望在蓝色背景上显示白色文本(默认行为)。
如果该行反映了错误并被选中,我希望它在蓝色背景上以红色文字显示。
到目前为止,我只能更改整个QTableWidget的选择颜色,这不是我想要的!
答案 0 :(得分:9)
回答自己,这就是我最终做的事情:代表。
此委托将检查项目的前景色角色。如果此前景色不是调色板的默认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));
答案 1 :(得分:1)
它看起来没问题,但您可能想查看QStyleOption
的文档,它可以告诉您绘制的项目是否被选中,您无需查看绘制颜色即可。我可能会给模型类一个用户角色,它返回数据是否有效,然后根据它做出颜色决定。即rIndex.data(ValidRole)
会返回此索引处的数据是否有效。
我不知道您是否尝试覆盖BackgroundRole的数据并返回自定义颜色,如果您更改颜色,Qt可能会做正确的事情
答案 2 :(得分: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;}");
}
答案 3 :(得分:0)
当然,您可以从表格小部件继承并覆盖绘制事件,但我认为这不是您想要做的。
相反,应该使用QAbstractItemDelegate
功能。您可以创建一个始终用于错误行,并设置错误行以使用该委托,或者创建一个知道如何绘制两种类型行的通用行。第二种方法是我推荐的。然后,您的委托适当地绘制行,即使对于选定的行也是如此。
答案 4 :(得分:0)
您可以使用例如一个proxy model,如果你有特定模型索引的错误,你会返回不同的颜色;
QVariant MySortFilterProxyModel::data(const QModelIndex & index, int role = Qt::DisplayRole) {
// assuming error state and modelindex row match
if (role==Qt::BackgroundRole)
return Qt::red;
}