QT4 QStringListModel в QListView

#c #qt #qt4 #qlistview

#c #qt #qt4 #qlistview

Вопрос:

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

Я хочу добавить элементы в список, на данный момент предположим, что это строки. У меня есть 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? Я сделал что-то не так с нулевым значением?

Спасибо.

Комментарии:

1. Примечание: Нет необходимости создавать QStringLists в куче. Контейнеры неявно являются общими и обычно передаются по значению /const ref.

2. ДА. В Qt вы можете передавать экземпляры may (например, QString, QList) по значению без каких-либо вычислительных затрат. посмотрите здесь

Ответ №1:

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

 class StringList : public QStringListModel
{
public:
  void append (const QStringamp; string){
    insertRows(rowCount(), 1);
    setData(index(rowCount()-1), string);
  }
  StringListamp; operator<<(const QStringamp; string){
    append(string);
    return *this;
  }
};
  

Ответ №2:

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

 stringList->append("xyz");
listModel->setStringList(*stringList);