Выходит, что нельзя для QSqlTableModel setData с Qt::backgroundRole применять...
Можно! Вот тебе workaround:
C++ (Qt)
#include <QMap>
#include <QPair>
class SqlQueryModel : public QSqlQueryModel
{
public:
typedef QMap< QPair< int, int >, QMap< char, QVariant > > RolesMap;
SqlQueryModel( QObject* parent = 0, QSqlDatabase db = QSqlDatabase() )
: QSqlQueryModel( parent, db ) {}
QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const
{
if( !index.isValid() )
return QVariant();
if( role == Qt::DisplayRole || role == Qt::EditRole )
return QSqlQueryModel::data( index, role );
RolesMap::const_iterator it = roles_data_.find( qMakePair( index.row(), index.column() ) );
return it != roles_data_.end() ? it.value()[ char( role )] : QVariant();
}
bool setData( const QModelIndex& index, const QVariant& value, int role = Qt::EditRole )
{
if( !index.isValid() )
return false;
if( role == Qt::DisplayRole || role == Qt::EditRole )
return QSqlQueryModel::setData( index, value, role );
roles_data_[ qMakePair( index.row(), index.column() ) ][ char( role ) ] = value;
return true;
}
bool removeColumns( int column, int count, const QModelIndex& parent = QModelIndex() )
{
Q_UNUSED(parent);
int rows = rowCount();
if( !QSqlQueryModel::removeColumns( column, count ) )
return false;
for( int r = 0; r < rows; r++ )
for( int c = column; c < column + count; c++ )
{
RolesMap::iterator it = roles_data_.find( qMakePair( r, c ) );
if( it != roles_data_.end() )
roles_data_.erase( it );
}
return true;
}
bool removeRows( int row, int count, const QModelIndex& parent = QModelIndex() )
{
Q_UNUSED(parent);
int cols = columnCount();
if( !QSqlQueryModel::removeRows( row, count ) )
return false;
for( int r = row; r < row + count; r++ )
for( int c = 0; c < cols; c++ )
{
RolesMap::iterator it = roles_data_.find( qMakePair( r, c ) );
if( it != roles_data_.end() )
roles_data_.erase( it );
}
return true;
}
void clear()
{
QSqlQueryModel::clear();
roles_data_.clear();
}
private:
RolesMap roles_data_;
};
Используй SqlQueryModel вместо QSqlQueryModel и всё заработает)
PS. Писал на скорую руку, так что может кое-что упустил и сделал не совсем оптимально)