Russian Qt Forum
Ноябрь 05, 2024, 22:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Модель и ее отображение  (Прочитано 6317 раз)
vasasol
Гость
« : Октябрь 14, 2008, 23:44 »

Здравствуйте!
Вот столкнулся (QT4.4)

сделал свою модель с фильтром
Код:
class mod_oper : public QSqlQueryModel {
     Q_OBJECT
 public:
    mod_oper(QObject *parent = 0);
    Qt::ItemFlags flags(const QModelIndex &index) const;
    QVariant data(const QModelIndex &index,
                   int role = Qt::DisplayRole) const;
     bool setData(const QModelIndex &index,
                  const QVariant &value, int role);
QDate* bdata;
QDate* edata;
// ну тут еще что-то

void refresh(const QString &f,const QString &dbeg,const QString &dend); // фильтр

Код:
// реализация фильтра
void mod_oper::refresh(const QString &f,const QString &dbeg,const QString &dend) {
       setQuery("select ВСЯКИЕ_ПОЛЯ from ОТКУДА where (kod_id="+f+") and (dta='"+dbeg+"') and (dto='"+dend+"')");
}

и чем ее смотреть (морду)

Код:
 class oper_view : public QTableView {
     Q_OBJECT
 public:
     oper_view(QWidget *parent = 0);
// ну тут еще что-то


в конструкторе моей формы (myform)

Код:
oper_v = new oper_view(this);
m_oper = new mod_oper(this);
oper_v->setModel(m_oper);
oper_v->hideColumn ( 0 );
oper_v->hideColumn ( 3 );
oper_v->hideColumn ( 12 );
// ну и еще несколько, которые не нужно видеть

добавляю запись к модели и потом делаю ей фильтр

Код:
void myform::add() {
//тут собственно добавление
m_oper->refresh("параметр1","параметр2","параметр3")
}

и на морде вижу появление всех колонок, которыe в конструкторе hideColumn(), которые вроде-бы не должны появляться Грустный ...

Я что-то забыл или не так сделал?
Записан
ритт
Гость
« Ответ #1 : Октябрь 15, 2008, 01:59 »

сколько колонок после кода `oper_v->setModel(m_oper)` и сколько после `m_oper->refresh("параметр1","параметр2","параметр3")` ?
Записан
vasasol
Гость
« Ответ #2 : Октябрь 15, 2008, 02:08 »

после oper_v->setModel(m_oper) но до их скрытия  и после m_oper->refresh("параметр1","параметр2","параметр3") одинаково - по 14
Записан
vasasol
Гость
« Ответ #3 : Октябрь 15, 2008, 02:12 »

еще точнее: после добавления записи но перед m_oper->refresh("параметр1","параметр2","параметр3") - 7 колонок, после m_oper->refresh("параметр1","параметр2","параметр3") - 14ю и кстати ширина их ........ меняется
Записан
ритт
Гость
« Ответ #4 : Октябрь 15, 2008, 13:19 »

после выполнения
 setQuery("select ВСЯКИЕ_ПОЛЯ from ОТКУДА where (kod_id="+f+") and (dta='"+dbeg+"') and (dto='"+dend+"')");
модель сбросится и колонки снова станут видимыми. сейчас в код не полезу, но если правильно помню, setQuery(...) не сравнивает старый запрос и новый, а полностью перезапрашивает данные.

если "ВСЯКИЕ_ПОЛЯ" - это все поля таблицы, то самое простое решение - возьми за основную модель QSqlTableModel.
Записан
vasasol
Гость
« Ответ #5 : Октябрь 15, 2008, 14:15 »

"ВСЯКИЕ_ПОЛЯ" - это не все поля таблицы, а QSqlTableModel не совсем удобно .....
Записан
ритт
Гость
« Ответ #6 : Октябрь 15, 2008, 14:32 »

заглянул в код - проверка выполняется.
не понимаю как до setQuery может быть 7 столбцов, а после - 14. до setQuery должно быть 0 столбцов.
Записан
vasasol
Гость
« Ответ #7 : Октябрь 15, 2008, 14:39 »

ну 7 полей должно быть потому-что в морде остальные hidden. кстати, после удаления данных и применения фильтра морда не меняется - все теже 7 полей ...Грустный
Записан
ритт
Гость
« Ответ #8 : Октябрь 15, 2008, 14:57 »

должно быть 0.
разве что, ты в конструкторе зовёшь setQuery, но это был бы уже изврат какой-то...
Записан
vasasol
Гость
« Ответ #9 : Октябрь 15, 2008, 17:11 »

Да нет, не делаю ...... ну и как-то не вписывается удаление - такого эффекта (появления столбцов) при удалении нет....
Записан
ритт
Гость
« Ответ #10 : Октябрь 15, 2008, 17:18 »

я уже теряю тему разговора.
надоело уже угадывать где/как/что...
выкладывай компилябельный пример - будем смотреть.
Записан
EhTemka
Гость
« Ответ #11 : Октябрь 16, 2008, 17:05 »

Цитировать
Код:
oper_v = new oper_view(this);
m_oper = new mod_oper(this);
oper_v->setModel(m_oper);
oper_v->hideColumn ( 0 );
oper_v->hideColumn ( 3 );
oper_v->hideColumn ( 12 );
// ну и еще несколько, которые не нужно видеть

добавляю запись к модели и потом делаю ей фильтр

в момент когда ты делаешь oper_v->hideColumn(x) у тебя скорее всего никаких колонок нет.
Попробуй вставить между строками:

Код:
...
m_oper = new mod_oper(this);
oper_v->setModel(m_oper);

int count = m_oper->columnCount();

oper_v->hideColumn ( 0 );
...

count  должен быть ноль, так как неоткуда там взятся колонкам (если конечно ты их вручную не создаешь в конструкторе. А если так, то setQuery их убивает)

Делай oper_v->hideColumn() после refresh(...):

Код:
void myform::add() {
//тут собственно добавление
m_oper->refresh("параметр1","параметр2","параметр3");
oper_v->hideColumn(x);
и т.д.
}

или там, где вызываешь myform::add()

или приконется к сигналу columnsInserted(const QModelIndex & parent, int start, int end) у модели и уже в слоте скрывай колонки.
Так кстати наверно будет правильней, потому как при неизменном запросе колонки вставляются один раз.

и еще не совсем понятна эта фраза...
Цитировать
добавляю запись к модели и потом делаю ей фильтр

Записан
vasasol
Гость
« Ответ #12 : Октябрь 16, 2008, 17:47 »

Цитировать
или приконется к сигналу columnsInserted(const QModelIndex & parent, int start, int end) у модели и уже в слоте скрывай колонки.
Так кстати наверно будет правильней, потому как при неизменном запросе колонки вставляются один раз.
Пасиб. Это работает.

Цитировать
и еще не совсем понятна эта фраза...
Цитировать
добавляю запись к модели и потом делаю ей фильтр
Ну описанный эффект проявляется в случае добавления записи, т.е. я сделал INSERT INTO таблице, потом
m_oper->refresh("параметр1","параметр2","параметр3") а если DELETE FROM из оттуда и потом
m_oper->refresh("параметр1","параметр2","параметр3") - все пучком - и записи удалились и колонки не появились.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.132 секунд. Запросов: 21.