Добрый день всем!
Есть у меня небольшое приложение. Окно, со списком (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)
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()));
void MyDictWindows::findItem()
{
Database* db = Database::Instance();
db->findItem(lineEdit->text(), myView);
}; //MyDictWindows::findItem
while (model->canFetchMore ()) {
model->fetchMore ();
}
ОГРОМНОЕ спасибо!!! Список подгужается полностью, и поиск работает отлично.
ps: За оформление сори, буду иметь в виду
Ещё есть 2 вопроса по поводу могего представления.
Вопрос первы: Как сделать так, чтобы маркер (который перемещается по списку в зависимости от значения в поле ввода) был синего цвета ? В данный момент когда в фокусе поле ввода, маркер серый (список не в фокусе).
Второй вопрос: Как сделать так, чтобы в представление "влезало" только целое колличество строк? Сейчас из-за границы окна виднеются хвостики не помещающейся строки... Нужно сделать так чтобы отображалось столько строк сколько влезло целиком (с учётом того что окно можно растягивать)...
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)