crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Вывести в combobox значения 2-х столбцов
iCast
  опции профиля:
сообщение 7.10.2017, 13:37
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 22
Регистрация: 22.9.2012
Пользователь №: 3527

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть столбцы таблицы: id | name | age

Посоветуйте, как правильно выводить текст в combobox, чтобы был такой формат: name - age. например, вася - 18

Пробовал вот так:
Раскрывающийся текст
//получаем нашу модель
QUserModel *modelUser = static_cast<QUserModel *>(_model->relationModel(_model->fieldIndex("somekey")));
ui->combobox->setModel(modelUser);
ui->combobox->setModelColumn(modelUser->fieldIndex("name"));

// реализация класса

class QUserModel : public QSqlTableModel {
public:
    explicit QUserModel (QObject* parent=nullptr):QSqlTableModel(parent){}
    ~QUserModel (){}
protected:
    QVariant data(const QModelIndex &index, int role) const
    {
        qDebug() << role;
        if(role == Qt::DisplayRole && index.column() == fieldIndex("name") ){
            QVariant age = QSqlTableModel::data(index.sibling(index.row(),fieldIndex("age")), role);
            QVariant name = QSqlTableModel::data(index, role);
            qDebug() << name << age;
            QSqlTableModel::data(index, role);
        }
        return QSqlTableModel::data(index, role);
    }
};

В дебаге пусто...

Пробовал вот так еще:

Раскрывающийся текст
class QUserFilter : public QSortFilterProxyModel
{
public:
    explicit QUserFilter (QObject* parent=nullptr):QSortFilterProxyModel(parent){}
    ~QUserFilter (){}
protected:
    bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const{
        QModelIndex indexName = sourceModel()->index(source_row, 1, source_parent);
        QModelIndex indexAge = sourceModel()->index(source_row, 2, source_parent);
        QVariant name = sourceModel()->data(indexName,Qt::EditRole);
        QVariant age= sourceModel()->data(indexAge ,Qt::EditRole);
        if(name.isValid() && age.isValid()){
            QString result = name.toString() + " - " + age.toString();
        sourceModel()->setData(indexName,QVariant(result));
    }
     return true;
};

Буду благодарен в помощи)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Анна
  опции профиля:
сообщение 23.10.2017, 16:21
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


Ты на верном пути, но надо написать прокси модельку не от QSortFilterProxyModel, а от QAbstractProxyModel, которая имеет одну колонку -
int columnCount() const {return 1;}

а в data() как раз делает то, что ты написал в filterAcceptsRow() - объединяет значения из двух колонок в одно.

Такую модельку можно подсунуть в combobox.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 4.12.2020, 7:52