Russian Qt Forum
Ноябрь 26, 2024, 15:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: как в комбобокс правильно добавлять прежние значения?  (Прочитано 3394 раз)
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. обновление уже открытого списка

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

Может, этот вопрос кто уже решал?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Февраль 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);
   }

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Smogg
Гость
« Ответ #2 : Февраль 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().

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

Спасибо за подсказку)
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Февраль 03, 2014, 17:21 »

новые строки я добавляю, просто этот кусок не привел Улыбающийся
Код
C++ (Qt)
   if (ui->searchComboBox->findText(searchText) == -1)
   {
       ui->searchComboBox->insertItem(0, searchText);
       ui->searchComboBox->setCurrentIndex(0);
   }
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Smogg
Гость
« Ответ #4 : Февраль 03, 2014, 18:44 »

вот я и говорю, что вы не удаляете из показываемого списка итем с "активнымТекстом". На уникальность проверяете лишь при добавлении, т.е. в момент нажатия юзером кнопки "Поиск".
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Февраль 03, 2014, 19:16 »

а он и не должен удаляться по идее. только после совершения поиска перемещается наверх.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.296 секунд. Запросов: 23.