2016-06-20 7 views
1

Я изучаю Qt, и у меня есть некоторые трудности. я использовал QTableWidget и когда элемент получить двойной щелчок на изменение цвета строки:Qt QTableView row colow

for (int j = 0; j < ui->tableWidget->horizontalHeader()->count(); j++) { 
    ui->tableWidget->item(row, j)->setForeground(color); 
} 

Но теперь я использую QTableView, я создал QAbstractTableModel для этого и работают нормально. Я сделал некоторые фильтры с QSortFilterProxyModel и отлично работаю. Но у меня нет успеха в изменении цвета строки. Я уже пытался что-то вроде этого:

m_model.setData(m_model.index(1,2) , QColor(Qt::blue), Qt::BackgroundColorRole); 

И не работают. В модели :: setData() Я написал несколько отладок, и он присоединяется к функции справа, но не меняет цвет.

bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role) 
{ 
    if (data(index, role) != value) { 
     qDebug() << index << value << role; 
     emit dataChanged(index, index, QVector<int>() << role); 
     return true; 
    } 
    return false; 
} 

отладочный вывод:

QModelIndex(1,2,0x0,MyModel(0x7fffffffe408)) QVariant(QColor, QColor(ARGB 1, 0, 0, 1)) 8 
+4

Qabstractitemmodel не сохраняет значения самостоятельно. Вам нужно сохранить выбор в свойстве setData() и вернуть цвет для соответствующего индекса в ваших данных() impl. –

+0

Спасибо @FrankOsterfeld, я сделал это после вашего предложения :) –

ответ

0

Вы можете использовать собственный делегат пункт, в виде функции вызова конструкторы - setItemDelegate

в функции краски делегата переописать:

paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 

получить информацию о геометрии от QStyleOptionViewItem, о co ntent - QModelIndex

некоторые флаги, чтобы проверить состояние, в качестве примера:

if(option.state & QStyle::State_Selected) 
{ 
     painter->save(); 
     QPen pen(QColor(30, 144, 255, 255), 2, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin); 
     int w = pen.width()/2; 
     auto rect = option.rect; 
     rect.setX(0); 
     painter->setPen(pen); 
     painter->drawRect(rect.adjusted(w,w,-w,-w)); 
     painter->restore(); 
} 

Что касается двоеборья клика - в целях повторного осуществления mouseDoubleClickEvent, получить индекс (например: indexAt (event-> поз())) и сохраните некоторые цветовые данные, затем используйте эти данные в функции раскладки делегата.

Смежные вопросы