Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Smogg от Февраль 03, 2014, 15:31



Название: как в комбобокс правильно добавлять прежние значения?
Отправлено: Smogg от Февраль 03, 2014, 15:31
Например, в редакторе в окошке "найти/заменить" поле "найти" - это комбобокс, в котором можно выбирать уже использованные ранее строчки.

Какой алгоритм, что бы сделать тоже самое?

Код:
 
 bool ComboFileFocusFilter::eventFilter( QObject *dist, QEvent *event ){
static QString sPrev;
QComboBox *cmb =qobject_cast<QComboBox *>(dist);

if( event->type() == QEvent::FocusIn )
{
bool bInsrt = true;
sPrev = cmb->currentText();
for (int i = 0; i < cmb->count() ; i++)
{
if (cmb->itemText(i) == cmb->currentText())
{
bInsrt = true;
break;
}
}
if (bInsrt)
{
cmb->insertItem(0, cmb->currentText());
}
}

if( event->type() == QEvent::FocusOut )
{
QString s = cmb->currentText();
for (int i = 0; i < cmb->count() ; i++)
{
if (cmb->itemText(i) == cmb->currentText())
{
cmb->removeItem(i);
cmb->setEditText(s);
break;
}
}
}
return false;
 }
 
То есть тут по событию "фокусПолучен" в список добавляется "активныйТекст". И по событию "фокусПотерян", если ничего не изменилось, то удаляется. Но тогда получается, что при нажатии на кнопку-стрелочку "развернуть список" начинается дерганье, ибо порядок действий случается такой:
1. список разворачивается
2. событие потери фокуса
3. обновление уже открытого списка

Кароч, код корявый и неправильный.

Может, этот вопрос кто уже решал?


Название: Re: как в комбобокс правильно добавлять прежние значения?
Отправлено: kambala от Февраль 03, 2014, 16:11
если ты имеешь в виду как перемещать строку из истории наверх, то я делаю так:
Код
C++ (Qt)
   // move the search string to the top of the last searches list if it is present there and not on the top
   if (ui->searchComboBox->currentIndex() > 0)
   {
       QStringList history;
       for (int i = 0; i < ui->searchComboBox->count(); ++i)
           history += ui->searchComboBox->itemText(i);
       history.move(ui->searchComboBox->currentIndex(), 0);
 
       ui->searchComboBox->clear();
       ui->searchComboBox->addItems(history);
   }

а зачем отлавливать событие фокуса я не совсем понял.


Название: Re: как в комбобокс правильно добавлять прежние значения?
Отправлено: Smogg от Февраль 03, 2014, 16:53
если ты имеешь в виду как перемещать строку из истории наверх, то я делаю так:
Код
C++ (Qt)
   // move the search string to the top of the last searches list if it is present there and not on the top
   if (ui->searchComboBox->currentIndex() > 0)
   {
       QStringList history;
       for (int i = 0; i < ui->searchComboBox->count(); ++i)
           history += ui->searchComboBox->itemText(i);
       history.move(ui->searchComboBox->currentIndex(), 0);
 
       ui->searchComboBox->clear();
       ui->searchComboBox->addItems(history);
   }

а зачем отлавливать событие фокуса я не совсем понял.

На самом деле, я тоже не до конца понимаю, а нужны ли тут события фокуса.
Цель первоначально была такая:
1. иметь список всех ранее введенных пользователем значений
2. в показываемом списке не должно быть повтора каррентТекста
3. предполагается, что пользовательские данные хранятся в самом комбобоксе и при необходимости получить "активное значение", то оно считывается напрямую через cmb->currentText().

Сейчас посмотрел, как работают другие комбобоксы с сохранением состояний, и оказалось, что добавляются не "введенные", а только "использованные" строчки. Проверок на совпадение с активным текстом нету, как и у Вас.

Спасибо за подсказку)


Название: Re: как в комбобокс правильно добавлять прежние значения?
Отправлено: kambala от Февраль 03, 2014, 17:21
новые строки я добавляю, просто этот кусок не привел :)
Код
C++ (Qt)
   if (ui->searchComboBox->findText(searchText) == -1)
   {
       ui->searchComboBox->insertItem(0, searchText);
       ui->searchComboBox->setCurrentIndex(0);
   }


Название: Re: как в комбобокс правильно добавлять прежние значения?
Отправлено: Smogg от Февраль 03, 2014, 18:44
вот я и говорю, что вы не удаляете из показываемого списка итем с "активнымТекстом". На уникальность проверяете лишь при добавлении, т.е. в момент нажатия юзером кнопки "Поиск".


Название: Re: как в комбобокс правильно добавлять прежние значения?
Отправлено: kambala от Февраль 03, 2014, 19:16
а он и не должен удаляться по идее. только после совершения поиска перемещается наверх.