Russian Qt Forum

Qt => Model-View (MV) => Тема начата: crazymonkey от Май 08, 2015, 18:24



Название: QCombobox и QAbstractListModel не добавляются элементы
Отправлено: crazymonkey от Май 08, 2015, 18:24
Добрый день.
Сразу к коду:
 
Код:
struct MetaGeneratorCommunication{
    GeneratorCommunication* communication;
    QString name;
};

class GeneratorsList: public QAbstractListModel{
    Q_OBJECT
public:
    GeneratorsList(QObject* parent = 0){}

    int rowCount(const QModelIndex &parent) const{
        return _data.size();
    }

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

        if( role == Qt::UserRole){
            QVariant var;
            var.setValue(_data[index.row()].communication);
            return var;
            return _data[index.row()].communication;
        }
        if (role == Qt::DisplayRole){
            return _data[index.row()].name;
        }

    }

    void addCommunication(GeneratorCommunication* data,QString name){
        MetaGeneratorCommunication tmp;
        tmp.communication = data;
        tmp.name = name;
        _data.append(tmp);
    }
private:
    QList<MetaGeneratorCommunication> _data;
};

Заполняется эта модель вот так вот:
Код:

    gen = new Frequency::GeneratorsList();
    gen->addCommunication(net_generator,"foo");
    gen->addCommunication(serial_generator,"bar");

    ui->comboBox->setModel(gen);

И в итоге на форме я вижу только один элемент в комбобоксе (причём первый добавленный)
Вроде всё по документации. Не могу понять где же я ошибся.


Название: Re: QCombobox и QAbstractListModel не добавляются элементы
Отправлено: torwig от Май 08, 2015, 19:06
Может быть здесь есть ответ на Ваш вопрос:
http://stackoverflow.com/questions/4702972/programmatically-adding-a-new-row-to-a-qabstractlistmodel-subclass .
Я думаю вот так просто как у Вас, append() и все, этого мало. Надо сообщать что модель изменилась.


Название: Re: QCombobox и QAbstractListModel не добавляются элементы
Отправлено: gil9red от Май 08, 2015, 19:41
Надо смотреть в доки: при добавлении элементов нужно вызывать методы beginInsertRows и endInsertRows:
Код
Java
class LogModel extends QAbstractTableModel {
...
   public void add(TermState state) {
       beginInsertRows(null, States.size(), States.size());
       states.add(state);
       endInsertRows();
   }
...    
   List <TermState> states = new ArrayList <TermState> ();
}
 

Для сишного варианта нужно не null передавать, а пустой QModelIndex:
beginInsertRows(QModelIndex(), ...