2013-04-02 3 views
0

Я использую 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(); 

Здесь Вы можете увидеть цвет первой ячейки зеленый и второй продавать красный раз мы выбираем первый ряд изменений цвета в белый.

+0

Надеюсь, я говорю о том, что вы ищете. Если это какой-то (или очень) другой, то просьба прокомментировать. :) – zeFree

+0

Спасибо, что поделились кодом! Это помогло мне в понимании вашей проблемы. Вы хотите сохранить цвет текста, который вы установили, независимо от того, выбрана ли ячейка. Это хорошо и сложно. Я удалю текущий ответ (поскольку он неактуальен) и будет искать решение вашей проблемы. – zeFree

ответ

0

Кажется, вы должны реализовать свой собственный вид таблицы, основываясь на QTableView и перезагрузки данных() функция:

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. Надеюсь, поможет.

+3

Возможно, вы имеете в виду подкласс QTableModel, а не QTableView. –

1

Вы также можете установить режим выбора в NoSelection для TableView. Затем вы можете использовать сигнал 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); 
    } 
}