Russian Qt Forum

Qt => Базы данных => Тема начата: Astrologer от Сентябрь 15, 2010, 11:18



Название: Фильтры
Отправлено: Astrologer от Сентябрь 15, 2010, 11:18
Всем привет.Мне нужно сделать фильтрацию по базе данных. Хочу над каждым столбцом сделать текстовое поле при вводе в которое будет осуществляться фильтрация. Как добавить над каждым столбцом QTableView QLineEdit чтобы по ширине он совпадал с ним?

Как добавить в QtreeWidget элемент, представляющий собой QLineEdit, чекбокс, .... ?


Название: Re: Фильтры
Отправлено: Пантер от Сентябрь 15, 2010, 11:29
Тут была тема про то, как встроить текстовые поля в заголовок. Подойдет? Если да, то пробежись по поиску.


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 15, 2010, 11:34
Спасибо, думаю подойдет. Только поиск не очень помогает(( киньте ссылку если под рукой есть. И еще вопрос. Например послы выборки мне необходимо сформировать отчет, однако нужно выбрать некоторое количество полей из таблицы. Как это сделать не обращаясь к базе? Насчет выбора полей - можно создать QTreeView и добавить чекбоксы на каждое поле текущей таблицы и по клику их прятать.


Название: Re: Фильтры
Отправлено: Пантер от Сентябрь 15, 2010, 11:49
Сам что-то найти не могу. Может кто еще подскажет.
По отчету подробнее опиши.

Посмотри вот эту ветку http://www.prog.org.ru/topic_12314_0.html


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 15, 2010, 11:55
Как определить щелчок по заголовку столбца?


Название: Re: Фильтры
Отправлено: crossly от Сентябрь 15, 2010, 12:16
Код:
void QHeaderView::sectionClicked ( int logicalIndex )   [signal]


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 15, 2010, 12:33
Спасибо. Мне кажется я неправильно соединяю, ибо не работает))
Код:
connect(view->verticalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(sort(int)));


Название: Re: Фильтры
Отправлено: BRE от Сентябрь 15, 2010, 12:35
Спасибо. Мне кажется я неправильно соединяю, ибо не работает))
Код:
connect(view->verticalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(sort(int)));
А точно нужен щелчек по verticalHeader, может все таки horizontalHeader?


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 15, 2010, 12:38
 :) Тысяча чертей, вы правы!!


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 15, 2010, 12:59
Насчет выбора полей - можно создать QTreeView и добавить чекбоксы на каждое поле текущей таблицы и по клику их прятать.

Кто нибудь сталкивался?


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 15, 2010, 14:17
Как проверить что QTreeWidgetItem не имеет parent или сделать так, чтобы оно было некликабельным? Ибо если по сигналу itemClicked(QWidgetItem* item, int column) попробовать вызвать item->parent()->text(0) то вылетает.


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 15, 2010, 14:28
Как то так.
Код:
void QDbfReader::item_selected(QTreeWidgetItem* item, int column)
{
    if (item->text(0) == "Objects" || item->text(0) == "Tables" || item->text(0) == "Records" ) return;
    if (item->parent()->text(0) == "Objects") select_object(item);
    if (item->parent()->text(0) == "Tables") select_table(item);
    if (item->parent()->text(0) == "Records")
    {
    }

}


Название: Re: Фильтры
Отправлено: BRE от Сентябрь 15, 2010, 14:32
Как проверить что QTreeWidgetItem не имеет parent или сделать так, чтобы оно было некликабельным? Ибо если по сигналу itemClicked(QWidgetItem* item, int column) попробовать вызвать item->parent()->text(0) то вылетает.
:)
Код
C++ (Qt)
if( item->parent() )
// parent != 0 // Имеет parent
else
// parent == 0 // Не имеет parent
 


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 15, 2010, 15:30
Ребят, есть какая нибудь идея как реализовывать фильтры по каждому столбцу?


Название: Re: Фильтры
Отправлено: crossly от Сентябрь 15, 2010, 16:08
сунуть комбо бокс в хидер и все...


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 15, 2010, 16:36
сунуть комбо бокс в хидер и все...

Как?


Название: Re: Фильтры
Отправлено: crossly от Сентябрь 15, 2010, 18:26
http://www.prog.org.ru/topic_6921_0.html (http://www.prog.org.ru/topic_6921_0.html)


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 16, 2010, 09:24
Пытаюсь отсортировать QSqlQuery
Код:

//  QSortFilterProxyModel *proxyModel;
// QSqlQueryModel* model
//QTableView* view
void QDbfReader::sort(int index)
{
  proxyModel->setSourceModel(model);
  view->setModel(proxyModel);
  proxyModel->setFilterKeyColumn(index);
}

Не работает((


Название: Re: Фильтры
Отправлено: Kolobok от Сентябрь 16, 2010, 11:03
Читай документацию внимательнее.

Код:
void QSortFilterProxyModel::sort ( int column, Qt::SortOrder order = Qt::AscendingOrder ) 


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 16, 2010, 11:08
Спасибо, не усмотрел сразу.

У меня поля все текстовые, в которых может быть числа и при сортировке получается что то вроде "1541.6", "232", "310", "810", ....


Название: Re: Фильтры
Отправлено: Kolobok от Сентябрь 16, 2010, 11:23
Переопредели

Код:
bool QSortFilterProxyModel::lessThan ( const QModelIndex & left, const QModelIndex & right ) const 

или

Код:
QVariant QAbstractItemModel::data ( const QModelIndex & index, int role = Qt::DisplayRole ) const

в основной модели.


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 17, 2010, 09:29
А если пойти другим путем, по этому мне не все понятно, как переопределять чтобы конвертило поле во float или int. Можно ли с помощью SQL команды изменить тип поля скажем с text на real?


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 17, 2010, 10:08
Переопредели

Код:
bool QSortFilterProxyModel::lessThan ( const QModelIndex & left, const QModelIndex & right ) const 

или

Код:
QVariant QAbstractItemModel::data ( const QModelIndex & index, int role = Qt::DisplayRole ) const

в основной модели.

А можно капельку поподробнее? Я еще новичок в этом деле!


Название: Re: Фильтры
Отправлено: Kolobok от Сентябрь 17, 2010, 10:12
А если пойти другим путем, по этому мне не все понятно, как переопределять чтобы конвертило поле во float или int.

Код:
QVariant SqlQueryModel::data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
{
  QVariant v = QSqlQueryModel::data ( index, role );
  switch(role)
  {
    case Qt::DisplayRole:
    case Qt::EditRole:
    {
      if( v.canConvert( QVariant::Double ) )
        return v.toDouble();
    }
  }
  return v;
}

Можно ли с помощью SQL команды изменить тип поля скажем с text на real?

Читай про alter table.


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 17, 2010, 12:48
QSqlQuery data уже перегружен. Сделал через проксифильтр.
Код:
bool MySortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
    QVariant leftData = sourceModel()->data(left);
    QVariant rightData = sourceModel()->data(right);

    if (leftData.canConvert(QVariant::Double))
    {
        bool ok1 = false;
        double a = leftData.toDouble(&ok1);
        double b = rightData.toDouble();
        if (ok1)
            return a < b;
    }

    if (leftData.canConvert(QVariant::String))
        return QString::localeAwareCompare(leftData.toString(), rightData.toString()) < 0;
}


Проблема в том, что
Код:
canConvert(QVariant::Double)
возвращает true, даже если на входе QVariant со значением "Текст". Для этого я и сделал такую завитушку.


Название: Re: Фильтры
Отправлено: Kolobok от Сентябрь 17, 2010, 13:44
Если есть возможность, лучше решить на уровне БД.


Название: Re: Фильтры
Отправлено: MoPDoBoPoT от Сентябрь 17, 2010, 13:50
Проблема в том, что
Код:
canConvert(QVariant::Double)
возвращает true, даже если на входе QVariant со значением "Текст". Для этого я и сделал такую завитушку.
canConvert(QVariant::Int) туда же... Тоже приходилось извращаться через toDouble(&ok).
Windows XP, Qt 4.5.2


Название: Re: Фильтры
Отправлено: Kolobok от Сентябрь 17, 2010, 14:39
Да, судя по коду canConvert() сравнивает типы данных, а не значения. В этом случае остается только toDouble(&ok).


Название: Re: Фильтры
Отправлено: Astrologer от Сентябрь 23, 2010, 12:11
Кстати Sqlite не поддерживает ALTER TABLE.

http://www.sqlite.org/lang_altertable.html

SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table.


Название: Re: Фильтры
Отправлено: crossly от Сентябрь 23, 2010, 12:21
точнее поддерживает но не полностью...