Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: jatsuk от Июня 08, 2011, 11:18



Название: Поиск как в Яндексе
Отправлено: jatsuk от Июня 08, 2011, 11:18
Здравствуйте, как можно реализовать поиск как в яндексе.

Есть Qlistedit, туда вводим слово. Должна всплывать подсказка, с возможными вариантами.
Сами эти варианты хранятся в таблице базы данных.
Пока набираешь каждую букву, варианты постепенно отпадают.

Как вообще можно это сделать ?


Название: Re: Поиск как в Яндексе
Отправлено: GreatSnake от Июня 08, 2011, 11:21
Код
C++ (Qt)
void QLineEdit::setCompleter ( QCompleter * c )


Название: Re: Поиск как в Яндексе
Отправлено: jatsuk от Июня 08, 2011, 12:18
Спасибо, нашел код, всё заработало

Код:
  QSqlTableModel* model = new QSqlTableModel();
    model->setTable("alfa");
    model->select();

    QCompleter *completer = new QCompleter(model);
    completer->setCaseSensitivity(Qt::CaseInsensitive);
    completer->setCompletionColumn(0);// столбец по которому ищем
    //completer->setMaxVisibleItems(10);

    connect(completer,SIGNAL(activated(QModelIndex)),this,SLOT(SelectAbonent(QModelIndex)));

     ui->lineEdit->setCompleter(completer);

Но теперь возникла проблема.
А если у меня несколько поисков. В зависимости какой чек бокс выбран, нужно искать по разным таблицам.


Название: Re: Поиск как в Яндексе
Отправлено: GreatSnake от Июня 08, 2011, 12:22
Ну дык и используй несколько QCompleter-ов.


Название: Re: Поиск как в Яндексе
Отправлено: jatsuk от Июня 08, 2011, 12:45
Да чё-то торможу немного  ;D

Сделал. Просто в слоте нажатия чек бокса вписать код, где переключается completer
 ui->lineEdit->setCompleter(completer3);

Все отлично, но осталось пару проблем.

НЕ работает completer->setMaxVisibleItems(10);
изза этого длина всплювающего окна может быть очень большой.
Компилятор ругается, что такого нет в completer, действительно нет, setMaxVisibleItems это для комбо боксов

И ещё странная сортировка, она наоборот, выдает результаты алфавита с конца (


Название: Re: Поиск как в Яндексе
Отправлено: GreatSnake от Июня 08, 2011, 12:51
НЕ работает completer->setMaxVisibleItems(10);
изза этого длина всплювающего окна может быть очень большой.
Компилятор ругается, что такого нет в completer, действительно нет, setMaxVisibleItems это для комбо боксов
Обнови Qt - This property was introduced in Qt 4.6.

Цитировать
И ещё странная сортировка, она наоборот, выдает результаты алфавита с конца (
См. QCompleter::modelSorting()
Цитировать
The sort order (i.e ascending or descending order) of the model is determined dynamically by inspecting the contents of the model.


Название: Re: Поиск как в Яндексе
Отправлено: jatsuk от Июня 08, 2011, 13:11
Спасибо большое.
Качаю qt creator 2.2

Стояла версия 2009 года (просто в универе на серваке лежала)
А чем вообще отличается qt  от qt creator ??

Я так понял qt  это основа , а с него уже делаются qt creator и т.д...


Название: Re: Поиск как в Яндексе
Отправлено: LisandreL от Июня 08, 2011, 13:43
Qt - набор библиотек и классов.
Qt Creator - один и редакторов, ориентированных на Qt.


Название: Re: Поиск как в Яндексе
Отправлено: GreatSnake от Июня 08, 2011, 13:44
Qt Creator - один и редакторов, ориентированных на Qt.
Скорее IDE, чем редактор)


Название: Re: Поиск как в Яндексе
Отправлено: jatsuk от Июня 08, 2011, 13:58
А что сделать, чтобы при определенном чек боксе эти всплывающие подсказки отключались ?


Название: Re: Поиск как в Яндексе
Отправлено: GreatSnake от Июня 08, 2011, 14:04
А что сделать, чтобы при определенном чек боксе эти всплывающие подсказки отключались ?
Ну а чего ассистент-то не читаешь ???
См. QLineEdit::setCompleter().


Название: Re: Поиск как в Яндексе
Отправлено: LisandreL от Июня 08, 2011, 14:12
Скорее IDE, чем редактор
Формально да, хотя средства компиляторы и отладчики у него в общем-то внешние от сторонних производителей, а сам Creator - текстовый редактор + средства автоматизации (сборки и др.).

А что сделать, чтобы при определенном чек боксе эти всплывающие подсказки отключались ?
setCompleter( 0 );


Название: Re: Поиск как в Яндексе
Отправлено: GreatSnake от Июня 08, 2011, 14:16
Формально да, хотя средства компиляторы и отладчики у него в общем-то внешние от сторонних производителей
Сейчас такое практически повсеместно во всех IDE, особенно под unix.


Название: Re: Поиск как в Яндексе
Отправлено: GreatSnake от Июня 08, 2011, 14:19
А что сделать, чтобы при определенном чек боксе эти всплывающие подсказки отключались ?
setCompleter( 0 );
Ну и зачем подсказываешь? :)
Я же ему ещё в своём первом посте дал ответ. Надо приучать быть внимательным.


Название: Re: Поиск как в Яндексе
Отправлено: jatsuk от Июня 08, 2011, 14:23
Половину скачал, надеюсь с этой функцией изменится размер.

Ерунда творится  :) с одной таблицей почему то все нормально всегда 7 элементов на букву.
А со второй таблицей неладное , то нормально с прокруткой , то без неё все элементы,  то вообще сначала все варианты, а потом белая колонка вниз до бесконечности

странно  :)


Название: Re: Поиск как в Яндексе
Отправлено: jatsuk от Июня 08, 2011, 14:24
я сначала посмотрел пост с См. QLineEdit::setCompleter()., а последний не заметил.
Нашел ответ сам, так что можно сказать приучился  ;D


Название: Re: Поиск как в Яндексе
Отправлено: jatsuk от Июня 09, 2011, 08:44
Скачал и поставил новый кутэ, установил ограничение completer3->setMaxVisibleItems(5);

Первая таблица нормально работает, ограничивается максимум 5
А со второй таблицей неладное , то нормально с прокруткой , то без неё все элементы,  то вообще сначала все варианты, а потом белая колонка вниз до бесконечности

В чем проблема может быть ???


Название: Re: Поиск как в Яндексе
Отправлено: daimon от Июня 09, 2011, 22:11
А вот такой вопрос как добавить всплывающую подсказку для всех содержимых строки в лайнедите по очереди типа A+B в лайнедите, а поочереди список вылезит сначала A потом B. Комплетер следит не за всей строкой а только за подстрокой с разделителями +-*/% ну и ещё что-то (в общем настраиваемый список как бы разделителя при просмотре возможных символов),


Название: Re: Поиск как в Яндексе
Отправлено: daimon от Июня 10, 2011, 00:59
tools/customcompleter есть пример под textwidget
Код
C++ (Qt)
 
void TextEdit::setCompleter(QCompleter *completer)
{
   if (c)
       QObject::disconnect(c, 0, this, 0);
 
   c = completer;
 
   if (!c)
       return;
 
c = new QCompleter (QStringList()<<"A"<<"B"<<"C"<<"AB");
c->setWidget(this);
 
   c->setCompletionMode(QCompleter::PopupCompletion);
c->setCaseSensitivity(Qt::CaseSensitive);
   QObject::connect(c, SIGNAL(activated(QString)),
                    this, SLOT(insertCompletion(QString)));
}
 

вот вставка для своих данных в список


Название: Re: Поиск как в Яндексе
Отправлено: LisandreL от Июня 10, 2011, 08:39
Код
C++ (Qt)
   c = completer;
   if (!c)
       return;
c = new QCompleter (QStringList()<<"A"<<"B"<<"C"<<"AB");
 
Ничего, что у вас тут память течёт?


Название: Re: Поиск как в Яндексе
Отправлено: daimon от Июня 10, 2011, 12:45
Код
C++ (Qt)
   c = completer;
   if (!c)
       return;
c = new QCompleter (QStringList()<<"A"<<"B"<<"C"<<"AB");
 
Ничего, что у вас тут память течёт?


вообще-то это я просто так написал, не знаю как прилепить в класс QCompleter список возможнх элементов)))


Название: Re: Поиск как в Яндексе
Отправлено: jatsuk от Июня 12, 2011, 05:41
Всех, с новым праздником ;)

До сих пор не могу сделать, чтобы нормально отображались названия в  QCompleter

Долго не мог понять, почему он отобрыжает кучу пустого места и не реагирует на ограничение  completer->setMaxVisibleItems(7);

Но сегодня сделал все QCompleter через QSqlQueryModel
И какого было мое удивление, когда именно это поле названий НЕ ОТОБРАЖАЕТСЯ В МОДЕЛЬ
Все поля, всех таблиц нормально отображаются.

model.setQuery("SELECT * FROM alfa ORDER BY n_sim");
 completer = new QCompleter(&model);

Даже остальные поля этой таблицы, где названия - всё норм. А они не хотят.
Помоги те кто-нибудь, я в тупике...


Название: Re: Поиск как в Яндексе
Отправлено: jatsuk от Июня 16, 2011, 12:31
Понятия не имею почему не работало  ;D

Вот так все нормально

model3.setQuery("SELECT n_bol FROM sim ORDER BY n_bol");
 completer3 = new QCompleter(&model3);
 completer3->setCompletionColumn(0);// столбец по которому ищем
 completer3->setMaxVisibleItems(7);
connect(completer3,SIGNAL(activated(QModelIndex)),this,SLOT(SelectAbonent(QModelIndex)));

Мой вопрос, решен  ;)