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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Сразу несколько таблиц с данными на одной форме  (Прочитано 9682 раз)
chester
Гость
« Ответ #15 : Ноябрь 25, 2011, 12:48 »

Кхм. возможно ВЫ просто так думаете.
Меняются же не все 250+++ строк?
Ну я же после каждого добавления применяю метод select() к модели чтобы она обновилась.

Если же  у вас, как я понимаю, вложенные таблицы(1 строке в верхней таблице соответвует целая таблица нижнего уровня).
Тогда решайте, что вам проще:
1) выяснить приемлимый и устраивающий всех размер ячеек и тупо задать его фиксированно(и не будет вызовов и тормозов).
2) применять функцию ресайза к тем строкам, которые видны. Там помоему даже функция есть выдающая видимые строки.
Т.е. вместо 250+ строк будет обновляться 10-40(я не вкурсе какая у ВАС таблица).
3) подумать что не так и как можно реализовать по другому Улыбающийся
я конечно больше скланяюсь ко второму методу решения ... правда функцию выдавающую видимые строки не могу найти. А даже если такая есть, то надо же еще сигнал скролла ловить при прокручивании и resiz-ить ячейки которые прокручиваются
Записан
Bepec
Гость
« Ответ #16 : Ноябрь 25, 2011, 13:29 »

Цитировать
Ну я же после каждого добавления применяю метод select() к модели чтобы она обновилась.

Попробуйте использовать не select, а сигнал из модели beginInsertRow и endInsertRow. Они обновляют не всю таблицу, а только указанные строки.

Сам только на днях разбирался с моделями  и вынес 1 мудрость. Готов с тобой поделиться.

Если у тебя не меняются одновременно все елементы модели, но ты обновляешь всю модель, то ты делаешь что то неправильно Улыбающийся


Пример-Дополнение:
Идеал:
Код:
Вставлена новая модель в View - обновление всей таблицы ~500 записей
Меняется строка - обновление 1 строки
Добавление строки - обновление 1 строки
Как я раньше реализовывал:
Код:
Вставлена новая модель в View - обновление всей таблицы~500 записей
Меняется строка - обновление всей таблицы~500 записей
Добавление строки - обновление всей таблицы ~500 записей

заинтересуешься можем посмотреть как улучшить твою модельку.
« Последнее редактирование: Ноябрь 25, 2011, 13:32 от Bepec » Записан
chester
Гость
« Ответ #17 : Ноябрь 25, 2011, 13:53 »

Попробуйте использовать не select, а сигнал из модели beginInsertRow и endInsertRow. Они обновляют не всю таблицу, а только указанные строки.
Я сейчас конечно делаю также как Вы раньше реализовывали. Надо будет тоже поразбираться с этим. Но сейчас мне больше хочется разобраться как же мне быть с ложенной таблицей, сдесь больше заметнее тормоза, чем при добавлении напримерю. Спасибо, Bepec, за советы можт приведут они меня в нужное русло )))
Записан
Bepec
Гость
« Ответ #18 : Ноябрь 25, 2011, 14:07 »

Буду рад помочь, к тому ж мне самому надо с этим разбираться вплоть до написания самому себе мануала Улыбающийся
Записан
chester
Гость
« Ответ #19 : Ноябрь 28, 2011, 07:31 »

Bepec, добрый день!!!!
Пытаюсь все-таки реализовать Ваш вариант resiz-ить только видимые ячейки. Покопавшись на форуме, нашел такую вещь .... что если ячейка становится видимой, то у нее идет запрос Qt::DisplayRole. И вот что у меня в итоге получилось после того как переопределил классы QSqlTableModel и QTableView

Код
C++ (Qt)
#ifndef MYSQLTABLEMODEL_H
#define MYSQLTABLEMODEL_H
 
#include <QSqlTableModel>
#include <QWidget>
class MySqlTableModel: public QSqlTableModel{
       Q_OBJECT
public:
       MySqlTableModel(QWidget *parent):QSqlTableModel(parent){
       }
       ~MySqlTableModel(){}
       QVariant data(const QModelIndex &index,int role = Qt::DisplayRole) const{
           QVariant value = QSqlQueryModel::data(index, role);
                if(role != Qt::DisplayRole)
                    return value;
                if(index.column()==1){
                    emit sig(index.row());
                   return value;
                }
                return value;
        }
    signals:
        void sig(int row)const;
 
};
#endif // MYMODEL_H
 

Код
C++ (Qt)
#ifndef MYVIEW_H
#define MYVIEW_H
 
#include <QtGui\QTableView>
#include <QMessageBox>
#include "mysqltablemodel.h"
 
class MyView: public QTableView{
Q_OBJECT
public:
       MyView(QWidget *parent):QTableView(parent){
       maxVisibleColumn = -1;
       }
~MyView(){}
       void setModel (QAbstractItemModel * model ){
           connect(model, SIGNAL(sig(int)), this, SLOT(slotResizeRow(int)));
           QTableView :: setModel(model);
       }
 
private:
     int maxVisibleColumn;
public slots:
     void slotResizeRow(int row){
         if(maxVisibleColumn < row){
             maxVisibleColumn = row;
             resizeRowToContents(maxVisibleColumn);
         }
     }
};
#endif // MIVIEW_H
 

Сдесь работает только в случае первой загрузки модели ... не могу никак поймать сигнал когда модель обновляется, т.е. когда к ней применяется метод select(), чтобы сбросить maxVisibleColumn и заново resizить. Уж не знаю на сколько правильно я сделал, реально первый раз пробую перегружать существующие методы ))))
Записан
Bepec
Гость
« Ответ #20 : Ноябрь 28, 2011, 07:46 »

Реализация норм (на мой неискушенный взгляд), а как с быстродействием?

А попробовать сделать сигнал сброса значений и выдавать его одновременно с обновлением таблицы?
(если я правильно понял, что именно ты поймать не можешь Улыбающийся )
Записан
chester
Гость
« Ответ #21 : Ноябрь 28, 2011, 07:57 »

С быстродействием еще точн не могу сказать, пока не определюсь с обновлением ... но при загрузке прям быстрее  Улыбающийся
А попробовать сделать сигнал сброса значений и выдавать его одновременно с обновлением таблицы?
(если я правильно понял, что именно ты поймать не можешь Улыбающийся )
Пока у меня тоже только такие мысли. Просто хотелось бы сразу все в классе MyView реализовать и не задумываться об этом в основном коде. Вот и думаю как основными методами это сделать, может модель испускает какой-то сигнал или в каком-то методе что-то меняется при обновлении. Щас еще порыскаю  Улыбающийся
Записан
chester
Гость
« Ответ #22 : Ноябрь 28, 2011, 08:07 »

Нашел сигнал modelReset(), возможно то что мне нужно ... но он private. Может его можно как-то использовать?
Записан
Bepec
Гость
« Ответ #23 : Ноябрь 28, 2011, 08:19 »

Пробуй, смотри когда он вызывается.Обрати так же внимание на modelAboutToBeReset. Тоже самое, но перед изменением насколько я понял Улыбающийся
Записан
chester
Гость
« Ответ #24 : Ноябрь 28, 2011, 09:01 »

Этот сигнал походу испускается при setTable, а не при select() ((
Записан
Bepec
Гость
« Ответ #25 : Ноябрь 28, 2011, 09:27 »

Думаю тебе проще разнести по сигналу. А так очевидных и предъопределенных сигналов я больше не знаю Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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