更改QTableView的选择行为

更改QTableView的选择行为,qt,qtableview,Qt,Qtableview,我在Qt中使用QTableView,我有一个表,其中每个单元格都有不同的文本颜色。我有选择行为选择整行。但当我选择任何一行时,所选行的文本颜色将变为白色。我不想在选定行时更改文本颜色。我希望在选择任何行时显示原始颜色 我试图使用样式表,但它也改变了整行文本的颜色 我在这里张贴样本代码 QTableView * pQTableView = new QTableView(); QStandardItemModel *model = new QStandardItemModel(5,3);

我在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();
QTableView*pQTableView=newqtableview();
QStandardItemModel*模型=新QStandardItemModel(5,3);
pQTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
pQTableView->setModel(模型);
对于(int行=0;行<5;行++)
for(int列=0;列<3;列++)
{
QModelIndex index1=模型->索引(行、列);
Q变量值(“Swaminarayan”);
model->setData(index1,value,Qt::DisplayRole);
}
QModelIndex index1=模型->索引(0,0);
QOBJ变体(Qt::绿色);
model->setData(index1、Obj、Qt::TextColorRole);
index1=模型->指数(0,1);
QJ1变型(Qt::红色);
模型->设置数据(index1、Obj1、Qt::TextColorRole);
pQTableView->show();

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

似乎您应该基于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::BackgroundRole
Qt::foreggroundrole
您可以实现您的颜色


请参阅QAbstractTableModel以获取参考。希望有帮助。

您也可以将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);
  }
}
connect(myTableView,
信号(单击(常数QModelIndex&)),
这
插槽(onItemClicked(常数QModelIndex&));
//....
void数据模型::onItemClicked(常量QModelIndex和索引)
{
//获取单击的项目
QStandardItem*点击editem=myDataModel->itemFromIndex(index);
//吵架
int selectedRow=单击编辑项->行();
//对于每个颜色,根据需要更改颜色
对于(int c=0,colCount=myDataModel->columnCount();citem(selectedRow,c);
刷子;
笔刷。设置颜色(Qt::红色);
itemToChange->setData(画笔,Qt::ForegroundRole);
}
}

我希望我说的是你在找什么。如果有任何(或非常)不同,请回复。:)谢谢分享代码!这对我理解你的问题有很大帮助。您希望保留已设置的文本颜色-无论是否选中单元格。这是一个好的和艰难的。我将删除当前的答案(因为它是不相关的),并将为您的问题寻找解决方案。