18 апреля 2006

QSqlRelationalTableModel::setFilter(const QString & filter)

Есть в этом методе одна недокументированая особенность связаная с внешними ключами.
  1. Если ни одно отношение (QSqlRelation) в модель не добавлено, то её поведение ни чем не отличается от модели QSqlTableModel.
  2. Если добавлено хотя бы одно отношение, то для колонок без отношения строка фильтра должна выглядеть как "таблица.колонка = значение" (оператор сравнения естественно заменяем тем чем нам необходимо).
  3. Если добавлено хотя бы одно отношение, то для колонок с отношением строка фильтра должна выглядеть как "колонка = значение", но вместо имени колонки в таблице указанной методом QSqlRelationalTableModel::setTable() необходимо подставлять имя колонки указанной при создании отношения QSqlRelation::displayColumn().
Вот пример работающего кода:


QHash<QString, QString> filters; //ключ - имя колонки, значение - значение фильтра
QStringList filter;
QString tableName = table->tableName();

foreach(QString key, filters.keys())
if(_model->relation(_model->record().indexOf(key)).isValid()) {
filter << key + "='" + filters.value(key) + "'";
} else {
filter << tableName + "." + key + "='" + filters.value(key) + "'";
}

_model->setFilter(filter.join(" AND "));
_model->select();

17 апреля 2006

Начало.

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