В Qt создайте таблицу с пустой редактируемой строкой - PullRequest
5 голосов
/ 27 октября 2009

Это вопрос, связанный с Qt.

Удобно иметь возможность добавлять новые данные в таблицу, вводя содержимое в пустую строку внизу таблицы. Когда данные фиксируются, в таблицу добавляется новая пустая строка.

Кто-нибудь нашел способ реализовать это в общем виде, который вписывается в архитектуру программирования представления модели Qt? Моя ближайшая попытка заключается в создании прокси-модели, такой, чтобы rowCount(), возвращаемый из модели, всегда было на единицу больше, чем исходная модель.

QAbstractTableModel* sourceModel ; // Data is stored here
QBlankRowModel* model ; // Proxy model that adds one to rowCount()
QTableView* view ; // View
view->setModel( model ) ;
model->setSourceModel( sourceModel ) ;

Любые предложения приветствуются. Спасибо.

Ответы [ 3 ]

3 голосов
/ 05 ноября 2009

С точки зрения дизайна это должно быть частью представления, а не модели. Поэтому я предлагаю реализовать представление с функциональностью и оставить модель без изменений. KOffice Kexi делает это с kexitableview ( снимок экрана , документация ). Может быть, вы хотите использовать некоторые из их кода.

Кстати, вы все еще можете использовать свой хак и объединить его с моим предложением, поместив его в новую реализацию табличного представления YourTableView:

  1. QBlankRowModel повторно реализует QAbstractTableModel интерфейс. Возвращает sourceModel.rowCount()+1 как QBlankRowModel::rowCount(). Возвращает QVariant(), если в QBlankRowModel::data() запрашивается n+1 -я строка. Все остальное в QBlankRowModel пересылается в sourceModel (с редактированием n+1 th строка в QBlankRowModel буферизуется и заменяется вставкой в sourceModel по окончании).

  2. Новый YourTableView наследуется от QTableView и упаковывает sourceModel в YourTableView::setModel(), вызов QTableView::setModel(QBlankRowModel(sourceModel)).

Таким образом, ваш хак локализован в одной точке.

1 голос
/ 04 ноября 2009

Ваши решения кажутся немного хакерскими. Ваша проблема не только в дополнениях, но и в изданиях. Что происходит, когда ваш пользователь редактирует строку, введенные данные отправляются непосредственно на ваш «слой данных» даже до того, как пользователь фиксирует свою редакцию?

Лучшим решением было бы ограничить роль вашего sourceModel. Вместо того, чтобы быть «прямым» представлением ваших данных, оно должно быть «буферизованным» представлением этих данных. Когда sourceModel создан, вы делаете копию своих данных в некотором виде экземпляров Row (). SourceModel, имея свою собственную копию данных, может свободно воспроизводить, выполнять редакции и добавления и фиксировать данные только на уровне модели, когда пользователь вносит свои изменения.

Если вам нужен пример такой таблицы на PyQt, вы можете посмотреть на источник моего проекта:

http://hg.hardcoded.net/moneyguru/

Возможно, вам придется покопаться, чтобы действительно найти логику "буферизации", потому что она не в самом коде PyQt, а скорее в кроссплатформенной части кода:

http://hg.hardcoded.net/moneyguru/src/tip/core/gui/table.py

Эта логика затем используется в моем подклассе QAbstractItemModel:

http://hg.hardcoded.net/moneyguru/src/tip/qt/controller/table.py

0 голосов
/ 27 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...