2009-10-27 1 views
4

Это вопрос, специфичный для Qt.В 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) ; 

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

ответ

0

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

1

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

Лучшим решением было бы ограничить роль вашего источникаModel. Вместо того, чтобы быть «прямым» представлением ваших данных, это должно быть «буферизованное» представление. Когда 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

2

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

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

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

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

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

Смежные вопросы