Один QStandardItemModel для разных QTableView, общих и конкретных представлений

Я действительно не знаю, имеет ли это смысл, но это то, что я пытаюсь сделать:

Я делаю редактор своей игры в QT. В настоящее время я использую QStandardItemModel для хранения всех элементов моей сцены. Эти элементы имеют имена, положение, текстуры (вектор текстуры, который является пользовательским классом), анимацию (вектор анимации) и т. д.

Я считаю полезным иметь один элемент для строки, потому что я могу легко добавлять или удалять эти элементы, кроме того, что они находятся в одном месте, поэтому изменение этой модели должно повлиять на все приложение.

Теперь я пытаюсь сделать определенные виды, скажем, «текстуры» определенного элемента. Этот QTableView должен отображать имя текстуры, путь и т. д. Итак, в основном, как я могу получить вектор текстур в общей модели и заполнить другое представление, не создавая другую модель?


person Alberto Toglia    schedule 30.08.2010    source источник


Ответы (1)


Вы захотите использовать модель QSortFilterProxy. Настройте такой.

QTableView *tableView = new QTableView;
MyItemModel *sourceModel = new MyItemModel(this);
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);

proxyModel->setSourceModel(sourceModel);
proxyModel->setFilterKeyColumn(column_#_to_filter_by);
proxyModel->setFilterRegExp(a_regex_that_matches_the_item_you_want_to_display);
tableView->setModel(proxyModel);

Вы должны иметь возможность использовать одну модель и разные прокси для настройки разных представлений.

person Arnold Spence    schedule 30.08.2010
comment
Спасибо за код, теперь он выглядит довольно ясно, именно то, что я искал. Но у меня есть еще один вопрос, что, если я хочу захватить определенные столбцы для другого представления. Допустим, у вас есть модель лиц, у которых есть имя, фамилия, возраст, пол. И вам не нужен вид только с именем и фамилией. Этот прокси выглядит так, как будто он притворяется только для одного столбца. - person Alberto Toglia; 04.09.2010
comment
В этом случае вы можете просто настроить представление своей модели и для каждого столбца, который вас не интересует, вызвать setColumnHidden(column_num, true). - person Arnold Spence; 04.09.2010
comment
Я нашел и другое решение. Можно создать подкласс QSortFilterProxyModel и переопределить метод filterAcceptsColumn, в котором вы хотите вернуть значение false для столбцов, которые вы не хотите отображать. Спасибо еще раз. - person Alberto Toglia; 05.09.2010