Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Лишние пробелы в QSqlQueryModel
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
decaprox
Здравствуйте, господа!
У меня следующая проблема: имеется некая БД, в которой есть таблица drivers, мне необходимо загрузить поле driver_name в QListView. Делаю следующим образом:
QSqlQueryModel *model = new QSqlQueryModel(this);
model->setQuery("SELECT driver_name FROM drivers WHERE is_deleted = false;", m_db);

listView->setModel(model);



Это, понятное дело, отлично работает. Но, т.к. поле объявлено, как
driver_name character(80);

В QListView попадают строки содержащие значение поля дополненные пробелами дп 80 символов. Как сделать, чтобы в список попадала только "полезная часть" значения поля?
Steklova Olga
Мне кажется, можно сделать так (не скажу на 100%, так как сейчас нет под рукой Qt, могу проверить только завтра):
использовать модель класса-наследника от QSqlQueryModel, переопределив роли Qt::DisplayRole и Qt::EditRole.
Не уверена, какие из них Вам придется переопределить.
В моей программе пришлось
- для данных, отображаемых в QTableView, переопределять роль Qt::DisplayRole,
- для данных, отображаемых в QDataWidgetMapper, переопределять роль Qt::EditRole.
А у Вас примерно так:
#ifndef MYMODEL_H
#define MYMODEL_H

#include <QSqlQueryModel>

class MyModel : public QSqlQueryModel
{
    Q_OBJECT
public:
    MyModel(QObject *parent = 0);
    QVariant data(const QModelIndex &index,
                  int role = Qt::DisplayRole) const;
};

#endif // MYMODEL_H

#include <QtSql>

#include "mymodel.h"

MyModel::MyModel(QObject *parent) :
    QSqlQueryModel(parent)
{
}

QVariant MyModel::data(
        const QModelIndex &index,
        int role) const {

    QVariant value = QSqlQueryModel::data(index, role);

    switch (role) {

    case Qt::DisplayRole:
    case Qt::EditRole:
        if (index.column() == 0) //= 0, так как у Вас в запросе SELECT запрашивается только одно это поле
            return value.toString().trimmed(); //будут обрезаны начальные и конечные пробелы
        else
            return value;

    } //switch (role)

    return value;
}

Или изменить тип попя таблицы на VARCHAR(80).
decaprox
Спасибо Вам, Ольга! Просто поправил БД))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.