У меня есть QListView, в котором его модель (производная от QAbstractItemModel) регулярно изменяется на основе некоторых критериев в пользовательском интерфейсе. Я хотел бы получать уведомления, когда само представление считает, что новая строка была добавлена / удалена либо при обновлении текущей модели, либо при изменении модели. Мне нужно это уведомление, чтобы я мог вызвать setIndexWidget и добавить пользовательский элемент управления под конкретным столбцом. Я бы предпочел не вызывать setIndexWidget несколько раз, потому что заполнение виджета дорого. Так что один раз за ряд будет идеальным.
Я пробовал rowInserted / rowAboutToBeRemoved и dataChanged, но они не вызываются, если в представляемой модели уже есть элементы.
Любые мысли будут с благодарностью.
Ты ошибаешься dataChanged
, Если содержимое какого-либо элемента данных изменяется, то dataChanged
сигнализируется. Имеет место следующий инвариант, предполагая, что dataChanged
Слот подключен к тому же сигналу на модели.
class ... : public QObject {
QModelIndex m_index;
bool m_changed;
Q_SLOT void dataChanged(const QModelIndex & tl) {
m_changed = m_changed || tl == m_index;
}
...
};
m_index = QModelIndex(...);
QVariant before, after;
m_changed = false;
before = model->data(index);
after = model->data(index);
Q_ASSERT(before == after || m_changed);
То, что вы описываете, скорее всего, вызвано неправильным поведением вашей модели. Существует набор тестов моделей, который вы можете использовать для проверки соответствия вашей модели требуемым инвариантам.
Обращаясь конкретно к вашим вопросам:
Я хотел бы получать уведомления, когда само представление считает, что новая строка была добавлена / удалена либо при обновлении текущей модели …
Представлению не нужно ни во что верить. Ваша модель должна излучать соответствующие сигналы на этот счет. Просто подключитесь к этим сигналам от некоторых QObject
, Это все, что делает вид. Если сигналы не срабатывают, представление не будет уведомлено. Конец истории.
… или когда модель меняется.
Там нет сигнала для этого, так как вся модель заменена. Ты тот, кто звонит setModel
на вид, так что это не должно быть проблемой. Вы лучше знаете, когда сделан звонок 🙂
Других решений пока нет …