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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Кто как загружает QComboBox из БД  (Прочитано 12747 раз)
ildar
Гость
« Ответ #15 : Сентябрь 30, 2009, 09:55 »

не совсем так, вернее совсем не так, index - это срока комбо, а не колонка модели

Код:
/*!
   Returns the data for the given \a role in the given \a index in the
   combobox, or QVariant::Invalid if there is no data for this role.
*/
QVariant QComboBox::itemData(int index, int role) const
{
    Q_D(const QComboBox);
    QModelIndex mi = d->model->index(index, d->modelColumn, d->root);
    return d->model->data(mi, role);
}

после загрузки комбо из базы нужны 2 операции:

1. после выбора пользователем итема комбо, надо получить id этого итема, и тут проблем нет, т.к. индекс комбо - это строка модели

2. перед показом комбо пользователю надо выделить один из итемов. и у нас есть id этого итема, но нет его индекса в модели комбобокса. а вот как найти номер строки модели по значению одного из полей я и не нашел.

model::match() - не подходит т.к. "By default, this function will perform a wrapping, string-based comparison on all items, searching for items that begin with the search term specified by value." т.е. если искать 1, он найдет 1, 10, 11 ...

остается либо делать самому цикл по модели и искать номер строки
либо использовать QSortFilterProxyModel для поиска а потом позвать mapToSource, но оба варианта кажутся мне жуткими костылями

не думаю что я первый кто столкнулся с подобной задачей,
поделитесь опытом плиз
Записан
CroCIV
Гость
« Ответ #16 : Сентябрь 30, 2009, 11:02 »

Прошу меня простить, я недавно на C# ваял, дек это у меня от дотнетовского комбика в мозгу отложилось и наложилось.  Строит глазки

Диктую ответ:
1. Если нужен индекс текущего элемента модели (например комбобокс используется в связке с таблвью), то достаточно выполнить следующее действие
комбобокс->setCurrentIndex ( таблвью->currentIndex().row() );

2. Если известен только id модели, то делаем так:
комбобокс->setCurrentIndex (модель->match(модель->index(i,j,QModelIndex()),Qt::DisplayRole,s,k,Qt::MatchExactly).first().row())

где i - номер строки для начала поиска (нам нада скорее всего 0 (тебе виднее)), j - номер столбца по которому будет осуществляться поиск (нам нада 0). s - эталон для поиска типа QVariant, k - предельное кол-во совпадений (нам нада 1, т.к. флаг Qt::MatchExactly заставит искать полное соответствие с эталоном + id скорее всего уникален иначе это не id :-) )

З.Ы.: пример работает только если match гарантированно вернет хотябы одно значение, иначе повалится с ошибкой, иначе там надо будет обьявалять переменную QModelIndexList и проверять ее на empty ()
Записан
ildar
Гость
« Ответ #17 : Сентябрь 30, 2009, 11:08 »

да, enum Qt::MatchFlag я и упустил, обратил внимание только на дефолтные значения в match

спасиб  Подмигивающий
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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