Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Активный поиск в tablewidget, Использование QSortFilterProxyModel 
:(
    Опции темы
Belirafor
  Дата 12.8.2011, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.8.2009

Репутация: нет
Всего: нет



Привет, всем, участникам форума. Пишу курсовую работу. Вот возникла такая необходимость, как "активный поиск". Суть такова. При вводе строки в поле lEdt_Find в tblWgt_Employee отбирались данные, которые соответствуют этой строке без нажатия кнопки "Поиск". 

Подскажите, пожалуйста как правильно, используя QSortFilterProxyModel выполнить горячий отбор. Я нашел кучу примеров с QStringListModel. А вот для TableWidget ничего. Заранее спасибо.

Вот код:
Код
 
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
#include "QtSql"
#include "QDebug"
#include "QSortFilterProxyModel"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    db = QSqlDatabase::addDatabase("QSQLITE");
    QDir::setCurrent(QCoreApplication::applicationDirPath());
    db.setDatabaseName("passes.db");
 
    if(!db.open())
    {
        QMessageBox::critical(parent, QObject::tr("Ошибка"), db.lastError().text());
        exit(0);
    }
 
    setWindowTitle(tr("База данных пропусков"));
 
    fncTblWgtEmployee_Refresh();
 
    connect(ui->lEdt_Find, SIGNAL(textChanged(QString)), SLOT(fncFind()));
    connect(ui->tblWgt_Employee, SIGNAL(doubleClicked(QModelIndex)), SLOT(fncDlgEditEmployee_Show()));
 
}
 
void MainWindow::fncFind()       //Тут поле lEdt_Find. Куда вводится строка поиска
{
    qDebug() << ui->lEdt_Find->text();
//    QSortFilterProxyModel proxymodel;
//    proxymodel.setSourceModel();
//    proxymodel.setFilterKeyColumn(1);
//    proxymodel.setFilterWildcard(ui->lEdt_Find->text());
 
}
 
 
 
void MainWindow::fncTblWgtEmployee_Refresh()          //Тут мы заполняем таблицу TableWidget
{
    QSqlQuery qryEmployee_Show;
    qryEmployee_Show.exec(QString("SELECT pasNumID, lname, fname, ptrnym FROM employee_tbl ORDER BY lname DESC"));
 
    QTableWidgetItem *newItem;
    ui->tblWgt_Employee->setRowCount(0);
    ui->tblWgt_Employee->setSortingEnabled(true);
    while(qryEmployee_Show.next())
    {
        ui->tblWgt_Employee->insertRow(0);
        newItem = new QTableWidgetItem();newItem->setText(qryEmployee_Show.value(0).toString());
        ui->tblWgt_Employee->setItem(0,0, newItem);
        newItem = new QTableWidgetItem();newItem->setText(qryEmployee_Show.value(1).toString());
        ui->tblWgt_Employee->setItem(0,1, newItem);
        newItem = new QTableWidgetItem();newItem->setText(qryEmployee_Show.value(2).toString());
        ui->tblWgt_Employee->setItem(0,2, newItem);
        newItem = new QTableWidgetItem();newItem->setText(qryEmployee_Show.value(3).toString());
        ui->tblWgt_Employee->setItem(0,3, newItem);
        newItem = new QTableWidgetItem();
    }
 
    ui->tblWgt_Employee->resizeColumnsToContents();
    ui->tblWgt_Employee->verticalHeader()->setHidden(true);
    ui->tblWgt_Employee->setAlternatingRowColors(true);
    ui->tblWgt_Employee->horizontalHeader()->setStretchLastSection(true);
 
    int rowCount = ui->tblWgt_Employee->rowCount();
    statusBar()->showMessage(tr ("Количество записей в базе: ") + QString::number(rowCount));
}
 
MainWindow::~MainWindow()
{
    delete ui;
}

PM MAIL   Вверх
borisbn
Дата 12.8.2011, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Код

void MainWindow::fncTblWgtEmployee_Refresh( const QString & filter = QString() )
{
    QString execString = "SELECT pasNumID, lname, fname, ptrnym FROM employee_tbl ";
    if ( filter.isEmpty() == false )
    {
// не знаю, какое поле нужно фильтровать... взял первое попавшееся - lname
        execString += "WHERE lname LIKE %" + filter + "% ";
// след. строки можно закомментировать, если нужно искать только по одному полю
        execString += "OR fname LIKE %" + filter + "% ";
        execString += "OR ptrnym LIKE %" + filter + "% ";
    }
    execString += "ORDER BY lname DESC";
    qryEmployee_Show.exec( execString );
    ...
}

void MainWindow::fncFind()
{
    fncTblWgtEmployee_Refresh( ui->lEdt_Find->text() );
}

Хотя, гораздо более правильно будет использовать model/view + proxyFilterModel

Это сообщение отредактировал(а) borisbn - 12.8.2011, 12:50


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Belirafor
  Дата 12.8.2011, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.8.2009

Репутация: нет
Всего: нет



Нет, я хочу использовать QSortFilterProxyModel, чтобы не нагружать сервер лишними запросами из БД. Тем более, что fncTblWgtEmployee_Refresh используется для вывода информации в виджет tblwgt_Employee.

Цитата

Код

void MainWindow::fncTblWgtEmployee_Refresh( const QString & filter = QString() )
{
    QString execString = "SELECT pasNumID, lname, fname, ptrnym FROM employee_tbl ";
    if ( filter.isEmpty() == false )
    {
// не знаю, какое поле нужно фильтровать... взял первое попавшееся - lname
        execString += "WHERE lname LIKE %" + filter + "% ";
// след. строки можно закомментировать, если нужно искать только по одному полю
        execString += "OR fname LIKE %" + filter + "% ";
        execString += "OR ptrnym LIKE %" + filter + "% ";
    }
    execString += "ORDER BY lname DESC";
    qryEmployee_Show.exec( execString );
    ...
}
void MainWindow::fncFind()
{
    fncTblWgtEmployee_Refresh( ui->lEdt_Find->text() );
}



Хотя, гораздо более правильно будет использовать model/view + proxyFilterModel


Это сообщение отредактировал(а) Belirafor - 12.8.2011, 13:03
PM MAIL   Вверх
borisbn
Дата 12.8.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



В этом случае тебе нужно использовать не QTableWidget, а QTableView.
Ещё нужно наследоваться от QAbstractTableModel и создать QSortFilterProxyModel.
см. примеры Basic Sort/Filter Model и Custom Sort/Filter Model


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Belirafor
Дата 12.8.2011, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 15.8.2009

Репутация: нет
Всего: нет



Получается, что в tableWidget этого никак не проделать?

Цитата

В этом случае тебе нужно использовать не QTableWidget, а QTableView.
Ещё нужно наследоваться от QAbstractTableModel и создать QSortFilterProxyModel.
см. примеры Basic Sort/Filter Model и Custom Sort/Filter Model

PM MAIL   Вверх
Greeneyed
Дата 13.8.2011, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 20.4.2006

Репутация: нет
Всего: нет



Для работы с моделью используют QTableView. И это есть добро. Этот виджет избавит тебя от ручного запихивания данных в таблицу. Назначаешь для QSortFilterProxyModel источником свою модель данных, напимер QSqlQueryModel, и поле фильтрации. Для QTableView назначаешь моделью QSortFilterProxyModel . Если тебе надо фильтровать по нескольким полям, то нужно наследоваться от QSortFilterProxyModel и писать свой фильтр или использовать подряд несколько QSortFilterProxyModel. Т.е. QSortFilterProxyModel1 - источник для QSortFilterProxyModel2, QSortFilterProxyModel2 - источник для QSortFilterProxyModel3 и т.д.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.