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



Буду признателен за помощь. И как сделать так, чтобы список грузился целиком ....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 27.8.2010, 11:28
Сообщение #2


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


while (model->canFetchMore ()) {
    model->fetchMore ();
}

Это подгрузит полный список.
Пользуйся тегом code для форматирования.

Сообщение отредактировал panter_dsd - 27.8.2010, 11:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_qp_*
сообщение 27.8.2010, 11:52
Сообщение #3





Гости








    


ОГРОМНОЕ спасибо!!! Список подгужается полностью, и поиск работает отлично.

ps: За оформление сори, буду иметь в виду
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_qp_*
сообщение 31.8.2010, 12:01
Сообщение #4





Гости








    


Ещё есть 2 вопроса по поводу могего представления.

Вопрос первы: Как сделать так, чтобы маркер (который перемещается по списку в зависимости от значения в поле ввода) был синего цвета ? В данный момент когда в фокусе поле ввода, маркер серый (список не в фокусе).

Второй вопрос: Как сделать так, чтобы в представление "влезало" только целое колличество строк? Сейчас из-за границы окна виднеются хвостики не помещающейся строки... Нужно сделать так чтобы отображалось столько строк сколько влезло целиком (с учётом того что окно можно растягивать)...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 19.1.2022, 13:17