crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 30.10.2008, 18:03
Сообщение #1


Участник
**

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

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




Репутация:   5  


Собратья по Qt, будте милостивы, подскажите как прикрутить к QComboBox'у список совпадений внизу.
т.е. возможноли это реализовать без извращений?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.10.2008, 18:14
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


%QTDIR%\examples\tools\completer
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 30.10.2008, 19:07
Сообщение #3


Участник
**

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

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




Репутация:   5  


Уже все крутится)
Туплю)))).

Сообщение отредактировал ЙаМайскЫйПчОЛ - 30.10.2008, 19:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 30.10.2008, 19:13
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(ЙаМайскЫйПчОЛ)
Собратья по Qt, будте милостивы, подскажите как прикрутить к QComboBox'у список совпадений внизу.
т.е. возможноли это реализовать без извращений?

А что это такое - список совпадений? Интересно даже стало! Подскажите, пожалуйста.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.10.2008, 19:14
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(AD @ 30.10.2008, 22:13) *
А что это такое - список совпадений?
это по которому автозавершение работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 30.10.2008, 19:17
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Посмотрел на пример. Прочитал твой пост, Юрий. И нифига не понял. Что за автозавершение?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.10.2008, 19:23
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


в програмерских редакторах, его еще автодополнение называют.
AD, ты не дремлешь?:)

я-то уже торможу, но по моим часам мне пора, а тебе вроде рано :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 30.10.2008, 19:41
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 30.10.2008, 19:23)
в програмерских редакторах, его еще автодополнение называют.
AD, ты не дремлешь?:)

я-то уже торможу, но по моим часам мне пора, а тебе вроде рано :)

В Питере уже 19-40! А работать сегодня начал в 9-30 утра. Естественно притормаживаю, да и домой уже пора! :)
Я до сих пор не понял, что за автозавершение-дополнение? В смысле пишешь первые символы, а он дополняет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.10.2008, 19:42
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(AD @ 30.10.2008, 22:41) *
В смысле пишешь первые символы, а он дополняет?
именно!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ЙаМайскЫйПчОЛ
  опции профиля:
сообщение 31.10.2008, 9:03
Сообщение #10


Участник
**

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

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




Репутация:   5  


Докладываю.
класс автодополнения в Qt, называется QCompleter по умолчанию используется в QComboBox и QLineEdit.
Чтобы заюзать автоподстановщик (по умолчанию в QСomboBox он и так работает, только ModelSorting и CompletionMode надо задать какие хотим):

completer = comboBox->completer(); //нагло пользуемся тем, что нам дают указатель, но completer конечно же надо объявлять;)
completer->setModelSorting("ModelSorting вставить своё");
completer->setCompletionMode("CompletionMode"); // в моем случае CompletionMode = QCompleter::UnfilteredPopupCompletion
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vanvo
  опции профиля:
сообщение 11.2.2009, 14:27
Сообщение #11


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 18.8.2008
Пользователь №: 267

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




Репутация:   0  


ЙаМайскЫйПчОЛ, спасибо за предыдущий пост.
А как сделать, чтобы сравнение введенной строки в QComboBox с его содержимым происходило не с 1-го символа, а с каждого.
Поясню на примере: при вводе "чик", в QComboBox оставались не только "чик", "чик-чирик", а еще и "мальчик", "танчики".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.2.2009, 15:32
Сообщение #12


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


vanvo, тут ключем будет не виджет (QComboBox), а настройки QCompleter.
Посмотри QCompleter::UnfilteredPopupCompletion

возможно подойдет, ну и вообще доку по QCompleter почитай.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vanvo
  опции профиля:
сообщение 11.2.2009, 16:56
Сообщение #13


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 18.8.2008
Пользователь №: 267

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 11.2.2009, 15:32) *
vanvo, тут ключем будет не виджет (QComboBox), а настройки QCompleter.
Посмотри QCompleter::UnfilteredPopupCompletion

возможно подойдет, ну и вообще доку по QCompleter почитай.

Ну QCompleter::UnfilteredPopupCompletion ничего хорошего не делает... лишь проматывает список до первого совпадения
Доку по QCompleter я смотрел, что-то тоже ничего хорошего там не нашел :( Может стоит работать со списком QStringList?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.2.2009, 16:59
Сообщение #14


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(vanvo @ 11.2.2009, 19:56) *
Может стоит работать со списком QStringList?
а зачем?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vanvo
  опции профиля:
сообщение 11.2.2009, 18:57
Сообщение #15


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 18.8.2008
Пользователь №: 267

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 11.2.2009, 16:59) *
Цитата(vanvo @ 11.2.2009, 19:56) *
Может стоит работать со списком QStringList?
а зачем?

Мутить что-то типа:
comboBoxService->clear();
listService = listService.filter(key);
comboBoxService->addItems(listService);
key - введенная строка в comboBoxService
Еще вопросец: как отследить изменение текста в QComboBox, если мы еще не нажали Enter?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.2.2009, 19:04
Сообщение #16


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(vanvo @ 11.2.2009, 21:57) *
Еще вопросец: как отследить изменение текста в QComboBox, если мы еще не нажали Enter?
лучше сделай отлеьную тему, она достаточно автономна
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.2.2009, 19:46
Сообщение #17


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


vanvo, я именно по указанному вопросу предлагал сделать новую тему (я ее переименовал)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vanvo
  опции профиля:
сообщение 11.2.2009, 21:53
Сообщение #18


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 18.8.2008
Пользователь №: 267

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




Репутация:   0  


Сделал вот такую штуку
В главной функции:
QStringList list;
list << "mother" << "father" << "window" << "winamp" << "milk" << "milkway";
connect(comboBox, SIGNAL(editTextChanged(QString)), SLOT(mySlot(QString)));

void MainWindowImpl::mySlot (QString text)
{
    comboBox->clear();
    QStringList result = list.filter(text, Qt::CaseInsensitive);
    comboBox->addItems(result);
}

При наборе букв, содержащихся в list, программа сразу же вылетает. Почему?
Если закоментить comboBox->clear();, то программа работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.2.2009, 22:00
Сообщение #19


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(vanvo @ 12.2.2009, 0:53) *
При наборе букв, содержащихся в list, программа сразу же вылетает. Почему?
Если закоментить comboBox->clear();, то программа работает
почему при закоментированной отчистке продолжает работать я не знаю.
А почему аварийно завершается могу сказать, смотри:
Цитата
void QComboBox::addItems ( const QStringList & texts )

в этой функции принимается ссылка на список, а список у тебя создан как обычная переменная, как только функция завершится, то и удалится эта переменная. Соответственно QComboBox будет обращатся к неправильной области памяти
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vanvo
  опции профиля:
сообщение 11.2.2009, 22:43
Сообщение #20


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 18.8.2008
Пользователь №: 267

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 11.2.2009, 22:00) *
Цитата(vanvo @ 12.2.2009, 0:53) *
При наборе букв, содержащихся в list, программа сразу же вылетает. Почему?
Если закоментить comboBox->clear();, то программа работает
почему при закоментированной отчистке продолжает работать я не знаю.
А почему аварийно завершается могу сказать, смотри:
Цитата
void QComboBox::addItems ( const QStringList & texts )

в этой функции принимается ссылка на список, а список у тебя создан как обычная переменная, как только функция завершится, то и удалится эта переменная. Соответственно QComboBox будет обращатся к неправильной области памяти

Нет, дело не в памяти. Я список внутри слота объявил только для форума. А в программе объявление list и result происходит в описании класса.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Константин
  опции профиля:
сообщение 11.2.2009, 22:56
Сообщение #21


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 9.2.2009
Пользователь №: 539

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




Репутация:   1  


Цитата(Litkevich Yuriy @ 11.2.2009, 22:00) *
А почему аварийно завершается могу сказать, смотри:
Цитата
void QComboBox::addItems ( const QStringList & texts )

в этой функции принимается ссылка на список, а список у тебя создан как обычная переменная, как только функция завершится, то и удалится эта переменная. Соответственно QComboBox будет обращатся к неправильной области памяти

ай-ай-ай, Юрий :)
QStringList - это обёртка над QList<QString>, а QList, как известно, шаренный тип. т.о. проблема никак не в передаче по ссылке...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vanvo
  опции профиля:
сообщение 11.2.2009, 23:08
Сообщение #22


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 18.8.2008
Пользователь №: 267

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




Репутация:   0  


Может конечно все это и не нужно... Т.е. нужен, по сути, тот же самый QCompleter, но чтобы вхождение введенной в QComboBox строки искал не только с первого символа элементов списка.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.2.2009, 23:31
Сообщение #23


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(vanvo @ 12.2.2009, 1:43) *
Я список внутри слота объявил только для форума.
:lol:
продолжай в томже духе, помощь прийдет быстро.

Цитата(Константин @ 12.2.2009, 1:56) *
ай-ай-ай, Юрий
QStringList - это обёртка над QList<QString>, а QList, как известно, шаренный тип. т.о. проблема никак не в передаче по ссылке...
Хех, об этом я не подумал.

П.С. ко мне лучше на ты, мне так привычнее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 11.2.2009, 23:31
Сообщение #24


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


А что дебаггер говорит?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Константин
  опции профиля:
сообщение 12.2.2009, 0:07
Сообщение #25


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 9.2.2009
Пользователь №: 539

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




Репутация:   1  


а по теме - у меня впечатление, что через QCompleter реализация подобной задачи не предусмотрена...и никак не соображу как же это обойти, не наследуясь от комбобокса - уж слишком не хватает виртуальных методов у QCompleter...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.2.2009, 0:17
Сообщение #26


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


есть такой пример Iterating Through Completions.
Но я не вникал, годится оно или нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Константин
  опции профиля:
сообщение 12.2.2009, 0:52
Сообщение #27


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 9.2.2009
Пользователь №: 539

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




Репутация:   1  


Цитата(Litkevich Yuriy @ 12.2.2009, 0:17) *
есть такой пример Iterating Through Completions.
Но я не вникал, годится оно или нет

не, это совсем не то.

в общем, пошуршал сырцами qcompleter.cpp - и вот такая картина:
QMatchData QSortedModelEngine::filter(const QString& part, const QModelIndex& parent, int)
{
    const QAbstractItemModel *model = c->proxy->sourceModel();
//...
        probeIndex = model->index(probe, c->column, parent);
        probeData = model->data(probeIndex, c->role).toString();
        const int cmp = QString::compare(probeData, part, c->cs);
//...

как видите, используется QString::compare. если бы использовался QRegExp, то можно было бы изъ??нуться, а так - только писать самому...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 12.2.2009, 9:41
Сообщение #28


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(vanvo @ 11.2.2009, 22:43) *
Нет, дело не в памяти. Я список внутри слота объявил только для форума. А в программе объявление list и result происходит в описании класса.


походу editTextChanged(QString) вызывается если addItems вызываешь и у тебя комбо редактируемый. от этого и падение. а может и когда clear() делаешь тоже editTextChanged(QString) вызывается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 13.6.2025, 15:20