Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Модель/Представление _ Вывести в combobox значения 2-х столбцов

Автор: iCast 7.10.2017, 13:37

Есть столбцы таблицы: 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

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

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

Такую модельку можно подсунуть в combobox.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)