0

我在 Qt 中使用 QTableView,我有一个表格,其中每个单元格都有不同的文本颜色。我有选择行为选择整行。但是当我选择任何行时,所选行的文本颜色会变为白色。我不想在选择行时更改文本颜色。我希望在选择任何行时显示原始颜色。

我尝试使用样式表,但它也改变了整行文本的颜色。

我在这里发布示例代码

QTableView * pQTableView  = new QTableView();
QStandardItemModel *model = new QStandardItemModel(5,3);


    pQTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    pQTableView->setModel(model);
    for(int row = 0;row < 5;row++)
          for(int column = 0; column < 3; column++)
          {
             QModelIndex index1= model->index(row,column);

              QVariant  value("Swaminarayan");
              model->setData(index1, value,Qt::DisplayRole );

          }
    QModelIndex index1= model->index(0,0);
    QVariant Obj(Qt::green);
    model->setData(index1,Obj,Qt::TextColorRole );

     index1= model->index(0,1);
    QVariant Obj1(Qt::red);
    model->setData(index1, Obj1,Qt::TextColorRole );
    pQTableView->show();

在这里您可以看到第一个单元格的颜色为绿色,第二个单元格的颜色为红色,一旦我们选择第一行颜色更改为白色。

4

2 回答 2

1

您也可以将 TableView 的选择模式设置为 NoSelection。然后,您可以使用 itemClicked() 信号获取项目索引并根据需要为行中的每个项目设置其颜色。像这样的东西:

connect( myTableView,
    SIGNAL( clicked( const QModelIndex &) ), 
    this, 
    SLOT( onItemClicked(const QModelIndex &) ) ) ; 
//....

void DataModel::onItemClicked(const QModelIndex &index)
{
  //get the clicked item
  QStandardItem *clickedItem = myDataModel->itemFromIndex(index);

  // get the row
  int selectedRow = clickedItem->row();

  // for each col change the color as you want
  for(int c = 0, colCount = myDataModel->columnCount(); c < colCount; ++c)
  { 
    QStandardItem *itemToChange = myDataModel->item( selectedRow, c);
    QBrush brush;
    brush.setColor(Qt::red);
    itemToChange ->setData(brush, Qt::ForegroundRole);
  }
}
于 2016-06-23T12:00:38.273 回答
0

看来您应该基于 QTableView 实现自己的表格视图并重新加载 data() 函数:

QVariant YourTableViewClass::data(const QModelIndex &index, int role) const
{
    if(!index.isValid()) {
        return QVariant();
    }
    /* any other checks here */

    switch(role) {
        case Qt::BackgroundRole:
            return QColor(/* background colour here */);
        case Qt::ForegroundRole:
            return QColor(/* foreground colour here */);
        case Qt::DisplayRole:
            /* any other actions here */
        default:
            break;
    } /* switch(role) */

    return QVariant();
}

Qt::BackgroundRole你可以实现你的Qt::ForegroundRole颜色。

请参阅http://qt-project.org/doc/qt-5.0/qtcore/qabstracttablemodel.html以获取 QAbstractTableModel 以供参考。希望能帮助到你。

于 2013-07-18T14:52:17.930 回答