Russian Qt Forum
Ноябрь 27, 2024, 06:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [Решено] sql запрос в делегате  (Прочитано 9990 раз)
chu
Гость
« Ответ #15 : Апрель 25, 2012, 11:24 »

темку на форуме нашел: http://www.prog.org.ru/index.php?topic=16338.msg114651#msg114651
Цитировать
Так в том и проблема что QSqlTableModel игнорирует все кроме Qt::EditRole и Qt::DisplayRole
Выходит, что нельзя для QSqlTableModel setData  с Qt::backgroundRole применять...  Грустный
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #16 : Апрель 25, 2012, 12:45 »

Выходит, что нельзя для 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. Писал на скорую руку, так что может кое-что упустил и сделал не совсем оптимально)
« Последнее редактирование: Апрель 25, 2012, 12:47 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
chu
Гость
« Ответ #17 : Апрель 25, 2012, 17:24 »

Цитировать
Можно! Вот тебе workaround:
Я имел в виду, что нельзя setData с Qt::backgroundRole применять без переопределения модели.

За workaround спасибо! Работает как надо Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #18 : Апрель 25, 2012, 17:29 »

На самом деле тебе достаточно было перегрузить QSqlQueryModel::data(), в которой для Qt::BackgroundRole рассчитывать и возвращать цвет.
Записан

Qt 5.11/4.8.7 (X11/Win)
chu
Гость
« Ответ #19 : Апрель 26, 2012, 10:49 »

На самом деле тебе достаточно было перегрузить QSqlQueryModel::data(), в которой для Qt::BackgroundRole рассчитывать и возвращать цвет.
Так я и сделал:
Код:
QVariant MyModel::data(const QModelIndex &index, int role) const
{
    QVariant value = QSqlTableModel::data(index, role);
    if (role == Qt::BackgroundRole) {
        if(index.column()==3) {
            int id = index.sibling(index.row(),0).data().toInt();
            QColor color = QColor(colorMap.value(id));
            value = qVariantFromValue(color);
            return value;
        }
        else {
            return value;
        }
    }
}
colorMap рассчитывается за пределами модели, при селекте модели.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #20 : Апрель 26, 2012, 10:54 »

Судя по коду, MyModel::data() возвращает значение только для (role == Qt::BackgroundRole).
Записан

Qt 5.11/4.8.7 (X11/Win)
chu
Гость
« Ответ #21 : Апрель 26, 2012, 12:02 »

Судя по коду, MyModel::data() возвращает значение только для (role == Qt::BackgroundRole).
Проверял вызов data() с другими ролями, все в порядке!
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.164 секунд. Запросов: 22.