@timao

QAbstractTableModel или QSqlTableModel?

Нужен многостраничный QSqlTableModel с плюшками (поиск, сортировка), а в возможностях qt пока плохо ориентируюсь.

Табличка в базе большая, и чтобы она вся не грузилась, хочу приляпать кнопки типа "следующая страница" - "предыдущая" и сделать поиск + сортировку (по всем данным, не только на этой странице).

Нашёл вот такие компоненты, но скорее всего понадобятся не все. Подскажите, какую выбрать связку?

  • QAbstractTableModel
  • QSortFilterProxyModel
  • QItemDelegate
  • QSqlRelationalDelegate
  • QSqlTableModel
  • QSqlQueryModel
  • QSqlQuery
  • Вопрос задан
  • 3880 просмотров
Пригласить эксперта
Ответы на вопрос 2
@tugo
1. Поймите принцип взаимодействия модели, представления и делегата. Вот здесь хорошо описано .
2. Почитайте в книге Бланшет, Саммерфилд - QT4 Программирование GUI на ... начинай со страницы 326.

Табличка в базе большая, и чтобы она вся не грузилась, хочу приляпать кнопки типа "следующая страница" - "предыдущая"

Таблица не будет грузиться целиком. Вид (представление в виде таблицы, у вас будет представлен классом QTableView) будет запрашивать из модели (модель будет представлена или классом QSqlTableModel (редактируемая) или классом QSqlQueryModel (только чтение)) только то количество данных, которое помещается на экране. По мере прокрутки таблицы на экране, будут запрашиваться новые данные из модели.

Да, QSortFilterProxyModel вам понадобится, если захотите сделать сортировку. Сделайте пока без нее, потом сможете вставить QSortFilterProxyModel без проблем.

Чтобы вид (то, что на экране), представил данные из модели так, как вам нужно, нужно пользоваться делегатами.
Если данные - числа и строки - и так их и надо представить, то использовать свои делегаты не нужно.
Если хотите что-то нестандартное, вроде в данных число, а представить нужно определенным цветом, тогда нужно реализовывать свой делегат.
Для начала, можете не париться про делегаты.
Ответ написан
@timao Автор вопроса
Если кто-то наткнётся:
В итоге отнаследовался от QAbstractTableModel и сделал практически копию QSqlTableModel, но с одним нюансом: данные загружаются пакетами по 25 строк. К большому удивлению, таблица не подвисает при интенсивной прокрутке. Почти не заметно глазу. Ключевые куски кода:
QVariant DynamicSqlTableModel::data(const QModelIndex &index, int role) const {
	if (role == Qt::DisplayRole) {
		initializePackageByRow(index.row());
		return data_list[index.row()].value(index.column());
	}
	return QVariant();
}
void DynamicSqlTableModel::initializePackageByRow(int row) const {
	for (int i = data_list.size(); i <= row; i+= package_size) {
		QString package_query = setLimit(query, QString("%1, %2").arg(i).arg(package_size)); //моя строковая ф-я

		QSqlQuery q = QSqlQuery();
		q.setForwardOnly(true);
		if (!q.exec(package_query))  {
			emit error(logger(q, LOG));
			return;
		}
		while(q.next())
			data_list.push_back(q.record());
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы