6

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

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

这一切都很好,只要没有选择。一旦选择了一行,无论未选择的文本颜色如何,文本颜色都会在蓝色背景上变为白色(在我的计算机上)。

This is something I would like to change to get the following :
When a row is selected, if the row is reflecting there is no error, I would like it to be displayed with white text on blue background (default behavior).
如果该行反映错误并被选中,我希望它以蓝色背景上的红色文本显示。

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

4

5 回答 5

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));
于 2008-11-18T08:39:59.630 回答
1

它看起来不错,但您可能想查看它的文档,QStyleOption它可以告诉您绘制的项目是否被选中,您不必查看绘制颜色即可。我可能会给模型类一个用户角色,它返回数据是否有效,然后根据它做出颜色决定。即rIndex.data(ValidRole)返回该索引处的数据是否有效。

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

于 2008-11-28T21:34:25.997 回答
1

您要做的是将selectionChanged()QTableWidget 的 QItemSelectionModel 发出的信号连接到一个插槽,例如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;}");
}
于 2009-06-17T21:14:29.173 回答
0

当然,您可以从表格小部件继承并覆盖绘制事件,但我认为这不是您想要做的。

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

于 2008-11-13T17:44:42.797 回答
0

您可以为此使用代理模型,如果您对特定模型索引有错误,则返回不同的颜色;

    QVariant MySortFilterProxyModel::data(const QModelIndex & index, int role = Qt::DisplayRole) {
       // assuming error state and modelindex row match
       if (role==Qt::BackgroundRole)
         return Qt::red;
   }
于 2009-01-02T12:24:38.723 回答