在QTableWidget中,更改选定行的文本颜色

在QTableWidget中,更改选定行的文本颜色,qt,Qt,我正在使用QTableWidget显示几行。其中一些行应反映错误,并且其文本颜色已更改: 反映没有错误的行以默认颜色显示(我的计算机上白色背景上的黑色文本)。 反映有错误的行以红色文本颜色显示(在我的计算机上是白色背景上的红色文本) 只要没有选择,这一切都可以。一旦选定一行,无论未选定的文本颜色是什么,文本颜色在蓝色背景上始终变为白色(在我的计算机上) 这是我想要更改的内容,以获得以下内容: 当选择一行时,如果该行反映没有错误,我希望它以蓝色背景上的白色文本显示(默认行为)。 如果行反映错误并被

我正在使用QTableWidget显示几行。其中一些行应反映错误,并且其文本颜色已更改:

反映没有错误的行以默认颜色显示(我的计算机上白色背景上的黑色文本)。
反映有错误的行以红色文本颜色显示(在我的计算机上是白色背景上的红色文本)

只要没有选择,这一切都可以。一旦选定一行,无论未选定的文本颜色是什么,文本颜色在蓝色背景上始终变为白色(在我的计算机上)

这是我想要更改的内容,以获得以下内容:
当选择一行时,如果该行反映没有错误,我希望它以蓝色背景上的白色文本显示(默认行为)。
如果行反映错误并被选中,我希望它以蓝色背景上的红色文本显示


到目前为止,我只能更改整个QTableWidget的选择颜色,这不是我想要的

当然,您可以从table小部件继承并重写paint事件,但我认为这不是您想要做的


相反,应该使用
qabstractemdelegate
功能。您可以创建一个始终用于错误行的代理,并将错误行设置为使用该代理,或者创建一个知道如何绘制这两种类型行的通用代理。第二种方法是我推荐的。然后,您的代理适当地绘制行,即使是针对选定的行。

回答我自己,我最后做的是:代理

此代理将检查项目的前景色角色。如果此前景色不是调色板的默认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);
 }
};

它看起来还可以,但您可能需要查看
QStyleOption
的文档。它可以告诉您是否选择了绘制的项目,您无需查看绘制颜色即可完成此操作。我可能会给模型类一个用户角色,返回数据是否有效,然后根据该角色做出颜色决定。即,
rIndex.data(ValidRole)
将返回此索引中的数据是否有效

我不知道您是否尝试覆盖BackgroundRole的数据并返回自定义颜色,如果您在其中更改颜色,Qt可能会做正确的事情

您可以使用例如a来执行此操作,如果您对特定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;
   }

您需要做的是将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;}");
}

您当前用于设置文本颜色的代码是什么样子的?
if (noError)
{
    pTable->setStyleSheet("QTableView {selection-background-color: #000000; selection-color: #FFFFFF;}");
}
else
{
    pTable->setStyleSheet("QTableView {selection-background-color: #FF0000; selection-color: #0000FF;}");
}