QT4 QstringListModel в QListView

Это мой первый QT-вопрос — обычно я программист на С#, поэтому простите меня за глупый вопрос, на который, я уверен, есть очень простой ответ, который я просто не могу найти:

Я хочу добавить элементы в список, на данный момент скажем, что это строки. У меня есть QListView: UI->listView, QStringList и QStringListModel:

stringList = new QStringList();
stringList->append("ABC");
stringList->append("123");

listModel = new QStringListModel(*stringList, NULL);
ui->listView->setModel(listModel);

stringList->append("xyz");

Этот пример компилирует и удаляет "ABC" и "123" в моем списке, но не "xyz". Почему нет? Нужно ли как-то перекрашивать listView? Я сделал что-то не так с NULL?

Спасибо.


person Ozzah    schedule 27.04.2011    source источник
comment
Примечание. Нет необходимости создавать QStringList в куче. Контейнеры неявно совместно используются и обычно передаются по ссылке value/const ref.   -  person Frank Osterfeld    schedule 27.04.2011
comment
да. В Qt вы можете передавать множество экземпляров (например, QString, QList) по значению без каких-либо вычислительных затрат. смотрите здесь   -  person    schedule 27.04.2011


Ответы (2)


Вы изменили QStringList, вам нужно изменить модель:

stringList->append("xyz");
listModel->setStringList(*stringList);
person Donotalo    schedule 27.04.2011

Если вам часто нужно изменять список строк и у вас есть подключенные представления, которые необходимо обновлять, вы можете в первую очередь отказаться от QStringList и использовать исключительно QStringListModel. Вы можете добавлять/удалять данные туда, используя insertRows/removeRows и setData. Это гарантирует, что представления всегда отражают модель так, как вы ожидаете. Это может быть обернуто, чтобы предотвратить утомительную работу. Что-то вроде (не проверено):

class StringList : public QStringListModel
{
public:
  void append (const QString& string){
    insertRows(rowCount(), 1);
    setData(index(rowCount()-1), string);
  }
  StringList& operator<<(const QString& string){
    append(string);
    return *this;
  }
};
person Adversus    schedule 28.04.2011