更改QTableView的选择行为

时间:2013-04-02 04:46:59

标签: qt qtableview

我在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();

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

2 个答案:

答案 0 :(得分: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);
  }
}

答案 1 :(得分:0)

看来你应该基于QTableView和reload 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::BackgroundRoleQt::ForegroundRole,您可以实现颜色。

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