crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Тема закрытаНачать новую тему
> QSqlTableModel + QTableView + sort -> Debug ?, Стабильный вылет в Deb-g (MySQL) при сортировке
JohnZ
  опции профиля:
сообщение 30.7.2015, 10:44
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


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

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

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



Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 30.7.2015, 12:12
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


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

Копайте в сторону невалидных и испорченных индексов.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 30.7.2015, 12:47
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Так и есть, создана отдельная модель. Индексы вообще не трогаю :) Вот её 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.

Сообщение отредактировал JohnZ - 30.7.2015, 12:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 30.7.2015, 13:17
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


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

А как вы меняете видимые колонки?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 30.7.2015, 15:56
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Цитата(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
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 132
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


У Р А ! Нашёл ! Оказалось ошибка в СКРИПТЕ была !!! :yahoo:
function frmFilter()
{
  var   podr = frm481.getCurValue(1);
   var filter = "fld_508 = '"+podr +"'; ";  <---- Лишняя точка с запятой после подразделения !
   return(filter);
}

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

Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 17.2.2020, 22:04