crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Автопоиск + QlistView (Поиск и выделение элементов списка)
Гость_qp_*
сообщение 27.8.2010, 10:48
Сообщение #1





Гости








    


Добрый день всем!
Есть у меня небольшое приложение. Окно, со списком (QlistView) и строкой поиска. Задача в следующем. Неоходимо при вводе значения в поле QLineEdit производился поиск(по сигналу textChanged) соответствия из списка и если оно найдено ставить на него выделение (Вобщем самый обыкновенный автопоиск по списку). В общем и целом задачу я решил, вот только работает не правильно: автопоиск работает ТОЛЬКО до буквы "D" (у меня словарь). Далее не ищет. Список при старте приложения подгружается на полностью (как раз до буквы D с копейками) если его проскролить то он подгружается, но поиск всё равно не работает. Мне кажется проблема в этом ...

Итак что имею:

Вот так я получаю список:

void Database::getWordList(QListView *listView)
{
    model = new QSqlQueryModel(0);
    model->setQuery("SELECT key FROM wordlist");

    //Заполняем QStringList данными нашей модели
    for(int i=0; i<model->rowCount(); i++)
    {
        QSqlRecord record = model->record(i);
        listNames.append(record.value("key").toString());
    }
    listView->setModel(model);

    //Устанавливаем Выделение на первую строку
    listView->selectionModel()->setCurrentIndex(model->index(0,0), QItemSelectionModel::ClearAndSelect);

}; //getWordList(QListView *listView)

//listNames это QStringList listNames; для хранения строк модели. объявлена ранее.

Вот так реализована вынкция автопоиска (честно подсмотрена и немного исправлена):

void Database::findItem(QString text, QListView *myView)
{
    QString find="^"+text;      //Начинается с 'text'
    const QRegExp rw (find);
    //Если строка пустая, помещаем выделение на первый пункт.
    if(text.isEmpty())
    {
        myView->selectionModel()->setCurrentIndex(model->index(0,0), QItemSelectionModel::ClearAndSelect);
        return;
    }


    // Ниже метод listNames.filter возвращает список удовлетворяющих регэкспу слов
    if(listNames.filter(rw).isEmpty()) return;
    QModelIndexList indexList = model->match(model->index(0, 0), Qt::DisplayRole, listNames.filter(rw).first());
    if(indexList.isEmpty()) return;
    QModelIndex selectedIndex(indexList.first());
    myView->selectionModel()->setCurrentIndex(selectedIndex, QItemSelectionModel::ClearAndSelect);

}; //findItem(QString text, QListView *myView)


А это сигнал:

connect(lineEdit, SIGNAL(textEdited(QString)),
            this, SLOT(findItem()));


Это findItem:

void MyDictWindows::findItem()
{
    Database* db = Database::Instance();
    db->findItem(lineEdit->text(), myView);

}; //MyDictWindows::findItem



Буду признателен за помощь. И как сделать так, чтобы список грузился целиком ....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 3:05