6

QTableWidget を使用して複数の行を表示しています。これらの行の一部はエラーを反映し、テキストの色が変更されます:

エラーがないことを反映する行は、デフォルトの色 (私のコンピューターでは白い背景に黒いテキスト) で表示されます。
エラーがあることを反映する行は、赤いテキストの色で表示されます (私のコンピューターでは白い背景に赤いテキストです)。

選択がない限り、これで問題ありません。行が選択されるとすぐに、選択されていないテキストの色に関係なく、テキストの色は(私のコンピューターでは)青い背景の上に常に白になります。

これは、次のように変更したいものです:
行が選択されている場合、行が反映されている場合、エラーはありません。青い背景に白いテキストで表示されるようにしたいと思います (デフォルトの動作)。
行がエラーを反映して選択されている場合は、青い背景に赤いテキストで表示したいと思います。

これまでのところ、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

たとえば、特定のモデルインデックスにエラーがある場合は別の色を返すプロキシモデルを使用できます。

    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 に答える
0

もちろん、テーブル ウィジェットから継承してペイント イベントをオーバーライドすることもできますが、それはあなたがやりたいことではないと思います。

代わりに、QAbstractItemDelegate機能を使用する必要があります。エラー行に常に使用されるものを作成し、そのデリゲートを使用するようにエラー行を設定するか、両方の種類の行を描画する方法を知っている一般的なものを作成することができます。2番目の方法は、私が推奨する方法です。次に、デリゲートは、選択された行についても適切に行を描画します。

于 2008-11-13T17:44:42.797 に答える