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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QSqlTableModel + QTableView - всякие разные вопросы в одном топике  (Прочитано 16560 раз)
PavelVX
Гость
« Ответ #15 : Сентябрь 04, 2012, 08:25 »

1. Использовать QSqlTableModel::match() - не катит, она не фильтрует, а находит нужное вхождение, возможен переход туда.
С QCache не работал, надо почитать. Странно, что QSqlTableModel постоянно перезапрашивает данные. А если у меня стратегия редактирования мануалсабмит и я отфильтрую данные которые еще небыли закимитчены, это что, все пропадет что ли??? Бред какой-то Грустный
Передо мной тоже вот стоит проблема аналогичная - организовать то, что называется MemoryTable. Подобных реализаций на том же Дельфи достаточно много. Конечно в идеале хочется, чтоб понимала хотя бы примитивный вариант SQL, но по большому счету нужна только сортировка и выборка. в том-то и дело, странно как-то это, что нет подобного механизма.
Записан
Alex_C
Гость
« Ответ #16 : Сентябрь 05, 2012, 16:17 »

Я так понимаю, то, что нужно - это QtitanDataGrid
http://www.devmachines.com/
Но это коммерческий продукт.
Записан
PavelVX
Гость
« Ответ #17 : Сентябрь 07, 2012, 06:47 »

Коммерческий продукт не катит по определнию Грустный
Записан
kataklysm
Гость
« Ответ #18 : Сентябрь 09, 2012, 16:30 »

1. Использовать QSqlTableModel::match() - не катит, она не фильтрует, а находит нужное вхождение, возможен переход туда.
С QCache не работал, надо почитать. Странно, что QSqlTableModel постоянно перезапрашивает данные. А если у меня стратегия редактирования мануалсабмит и я отфильтрую данные которые еще небыли закимитчены, это что, все пропадет что ли??? Бред какой-то Грустный
Передо мной тоже вот стоит проблема аналогичная - организовать то, что называется MemoryTable. Подобных реализаций на том же Дельфи достаточно много. Конечно в идеале хочется, чтоб понимала хотя бы примитивный вариант SQL, но по большому счету нужна только сортировка и выборка. в том-то и дело, странно как-то это, что нет подобного механизма.
1.На самом деле это все возможно реализовать QCache.
2.Все зависит от самой модели. Изменения можно записывать сразу в QCache и фильтровать как угодно, а в БД производить запись после сабмита.
Записан
Danila_Bagrofff
Гость
« Ответ #19 : Сентябрь 13, 2012, 16:09 »

Не знаю, поможет ли вам это, но я для QTableView доделал немного функционал, чтобы пользователь мог скрывать/показывать нужные колонки и запоминать размер колонок и их отображение в файл настроек пользователя.

Код:
PTableViewData::PTableViewData(QWidget *parent) : QTableView(parent)
{
     connect(this->horizontalHeader(), SIGNAL(sectionResized(int,int,int)), this, SLOT(saveResize(int, int, int)));
     this->reset();
     //this->setSelectionMode(QAbstractItemView::SingleSelection);
     this->setSelectionBehavior(QAbstractItemView::SelectRows);
     this->setSortingEnabled(true);
     this->horizontalHeader()->setMovable(true);
}

void PTableViewData::setModelData(QString psevdo, QString fileName, QList<int> qLstIgnore, QAbstractTableModel *model)
{
    this->psevdo = psevdo;
    this->fileName = fileName;
    this->dataModel = model;

    qLstActions.clear();
    for(int i=0; i < dataModel->columnCount(); i++)
    {
        QString name = dataModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString();
        if(name == "")
            name = QString().setNum(i);
        qLstActions.append(new QAction(name, this));
        qLstActions.last()->setCheckable(true);

        QSettings set(fileName, QSettings::IniFormat);
        QString ch = set.value(psevdo + "_COLUMN/" + QString().setNum(i)).toString();
        if(ch == "")
            ch = "1";

        if(ch == "1")
            qLstActions.last()->setChecked(true);
        else
            qLstActions.last()->setChecked(false);

        for(int j=0; j < qLstIgnore.count();j++)
        {
            if(qLstIgnore.at(j) == i)
                qLstActions.last()->setVisible(false);
        }
        connect(qLstActions.last(), SIGNAL(triggered()), this, SLOT(setStateTable()));
    }

    this->horizontalHeader()->addActions(qLstActions);
    this->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);

    setStateTable();
}

void PTableViewData::setModelData(QString psevdo, QString fileName, QList<int> qLstIgnore, QSortFilterProxyModel *model)
{
    this->psevdo = psevdo;
    this->fileName = fileName;
    this->dataModel = model->sourceModel();
    this->headerModel = model;

    qLstActions.clear();
    for(int i=0; i < dataModel->columnCount(); i++)
    {
        QString name = headerModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString();
        if(name == "")
            name = QString().setNum(i);
        qLstActions.append(new QAction(name, this));
        qLstActions.last()->setCheckable(true);

        QSettings set(fileName, QSettings::IniFormat);
        QString ch = set.value(psevdo + "_COLUMN/" + QString().setNum(i)).toString();
        if(ch == "")
            ch = "1";

        if(ch == "1")
            qLstActions.last()->setChecked(true);
        else
            qLstActions.last()->setChecked(false);

        for(int j=0; j < qLstIgnore.count();j++)
        {
            if(qLstIgnore.at(j) == i)
                qLstActions.last()->setVisible(false);
        }
        connect(qLstActions.last(), SIGNAL(triggered()), this, SLOT(setStateTable()));
    }

    this->horizontalHeader()->addActions(qLstActions);
    this->horizontalHeader()->setContextMenuPolicy(Qt::ActionsContextMenu);

    setStateTable();
}

void PTableViewData::setStateTable()
{
    QSettings set(fileName, QSettings::IniFormat);

    for(int i=0; i < qLstActions.count();i++)
    {
        if(qLstActions.at(i)->isVisible() && !qLstActions.at(i)->isChecked())
            this->hideColumn(i);
        else if(qLstActions.at(i)->isVisible() && qLstActions.at(i)->isChecked())
            this->showColumn(i);

        set.setValue(psevdo + "_COLUMN/" + QString().setNum(i), QString().setNum(qLstActions.at(i)->isChecked()));
    }

    for(int i =0; i < this->horizontalHeader()->count();i++)
    {
        int s = set.value(psevdo + "_COLUMNSIZE/" + QString().setNum(i)).toInt();
        if(s == 0)
            s = 80;

        this->setColumnWidth(i, s);
    }
}


void PTableViewData::saveResize(int column, int oldsize, int size)
{
    if(size!=0)
    {
        QSettings set(fileName, QSettings::IniFormat);
        set.setValue(psevdo + "_COLUMNSIZE/" + QString().setNum(column), QString().setNum(size));
    }
}
Записан
PavelVX
Гость
« Ответ #20 : Сентябрь 14, 2012, 07:00 »

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


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