Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Разработка баз данных _ QSqlTableModel + QTableView + sort -> Debug ?

Автор: JohnZ 30.7.2015, 10:44

Всем Здравия !

Прошу прощения если не в том разделе спрашиваю, может это к относится к MVC ... Можно будет перенести.

Проблема следующая. Есть QSqlTableModel + QTableView. QSqlTableModel слегка изменена в плане видимых колонок,
но думаю что это неважно. Если выводится таблица полностью, т.е. без фильтра, сортировка по нажатию на заголовок колонки
работает без проблем, но если включен фильтр ( model->setFilter(Str); ) и попытке сортировать, имеем стабильный вылет в Debug, причём вылетает где-то в недрах драйвера MySQL по нулевому указателю. Где копать ? Если нужна модель, - выложу, но как я уже сказал, изменения минимальны, да и без фильтра ведь работает ... Помогите plz кто в сталкивался или в курсе.




Автор: lanz 30.7.2015, 12:12

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

Копайте в сторону невалидных и испорченных индексов.

Автор: JohnZ 30.7.2015, 12:47

Так и есть, создана отдельная модель. Индексы вообще не трогаю :) Вот её h- файл

Раскрывающийся текст

#ifndef FPTABLEMODEL_H
#define FPTABLEMODEL_H

#include <QtGui>
#include <QtSql>
#include <QSqlTableModel>


class fpTableModel : public QSqlTableModel
{

public:
fpTableModel(QObject * parent = 0, QSqlDatabase db = QSqlDatabase());
~fpTableModel();

void setTable ( const QString & tableName );
void setFilter(const QString & filter);
// void setSort(int column, Qt::SortOrder order);

void setDefFields(QStringList & df);

private:

int colsInList, colsInForm;
QStringList DefFields, DefHeaders, ColWidth;
};

#endif // FPTABLEMODEL_H

Причина создания потомка , void setDefFields(QStringList & df); Тут определяется кол-во видимых колонк в QTableView.
Я полагал что проблема в MySQL-ном драйвере qt, который при получении фильтра теряет указатель ?!
Ведь по сути, установка фильтра, это всего-лишь добавление в секцию where, и за это отвечает драйвер.
Модель-же получает уже готовый select. Сервер MySQL версии 4.1.

Автор: lanz 30.7.2015, 13:17

Проблема обычно в новом коде, вряд ли в драйвере.

А как вы меняете видимые колонки?

Автор: JohnZ 30.7.2015, 15:56

Цитата(lanz @ 30.7.2015, 13:17) *
Проблема обычно в новом коде, вряд ли в драйвере.

А как вы меняете видимые колонки?

Согласно заданного списка.
Раскрывающийся текст

#include "fptablemodel.h"

fpTableModel::fpTableModel(QObject * parent, QSqlDatabase db)
: QSqlTableModel(parent, db)
{
colsInList = colsInForm = 0;
}

fpTableModel::~fpTableModel()
{
}

void fpTableModel::setTable ( const QString & tableName )
{
QSqlTableModel::setTable ( tableName );
setEditStrategy(QSqlTableModel::OnRowChange);
// setEditStrategy(QSqlTableModel::OnManualSubmit);
// select();
colsInList = colsInForm = QSqlTableModel::columnCount();
}

void fpTableModel::setDefFields(QStringList &df)
{
DefFields = df;
colsInList = df.count();
}

void fpTableModel::setFilter(const QString & filter)
{
QSqlTableModel::setFilter ( filter );
select();
}

В общем-то ничего особенного, просто запоминаю переданный список, согласно которого потом в форме создаю колонки из этого списка. Если установки небыло, тогда показываются все колонки, т.е. вся таблица.

Автор: JohnZ 30.7.2015, 16:57

У Р А ! Нашёл ! Оказалось ошибка в СКРИПТЕ была !!! :yahoo:

function frmFilter()
{
  var   podr = frm481.getCurValue(1);
   var filter = "fld_508 = '"+podr +"'; ";  <---- Лишняя точка с запятой после подразделения !
   return(filter);
}

2 дня угрохал на точку с запятой. Ведь в действительности я её ставил перед ORDER BY ... при заданной сортировке. Когда сортировка отключена была, ORDER BY в SELECT-е небыло. Дальше думаю понятно.
LANZ - СПАСИБО ЗА УЧАСТИЕ. Твой вопрос натолкнул на правильную мыслю ... СПАСИБО !!!
Тема закрыта.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)