Вопрос такой: в эдит-поле вводится сериный номер, чуть ниже список серийных номеров, выбранных из БД. Как заставить при введении цифры номера, фокус перемещался на первый найденный элемент. Это общая задача.
Более конкретно: у меня есть имя серийного номера, как зная это имя получить QModelIndex по которому я смогу определить элемент в QListView? Буду благодарен за любую помощь.
Вроде ведь многие работали с таблицами, с БД, с модель-представление. Неужели никто не сталкивался с подобными задачами? Мне кажется такого рода задачка в первую очередь встанет. По заданному значению параметра найти индекс модели. Помогите, пожалуйста.
AD, ищи по форуму, про автоподстановку в комбобоксе, недавно было, механизм тотже
Блин, я реально не могу найти нужную тему. А мне это очень необходимо!!!
http://www.forum.crossplatform.ru/index.php?showtopic=1560
Не очень-то подходит. QComboBox имеет довольно удобные функции, которых нет в QListView! Потом в данном примере не указывается как фокус на нем установить. В QComboBox просто выбирается заданный элемент, ЕСЛИ НА НЕГО НАЖАТЬ!!!
AD, в указанной теме говорилось об автозавершении, т.е. есть комбобокс, внего вводятся символы, а в выподающем списке показывается наиболееблизкое совпадение.
у тебя все тоже самое, только поле в вода и список, список в комбобоксе использует концепцию модель/представление, а для авто завершения QCompleter который всю механнику совпадений и связь с Селекшнмодель берет на себя.
Т.о. тебе указан путь к решению задачи, готового кода скорее всего нет.
На англоязычном форуме подсказали правильное решение. Данная штука решается с помощью
QModelIndexList QAbstractItemModel::match ( const QModelIndex & start, int role, const QVariant & value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags( Qt::MatchStartsWith | Qt::MatchWrap ) ) const [virtual]
Вот описание слота, который решает мою проблему:
/// Поиск в левом списке номера, часть (или он весь) которого отражена в new_SN
void LicenceBuilder::findLeftSN(const QString& new_SN)
{
if(new_SN.isEmpty()) return;
QSqlTableModel model;
model.setTable("DeviceList");
model.select();
QStringList listNames, selList;
for(int i=0; i<model.rowCount(); ++i)
{
QSqlRecord record = model.record(i);
listNames.append(record.value("serialNumber").toString());
}
foreach(QString name, listNames)
if(name.indexOf(new_SN, 0, Qt::CaseInsensitive) != -1)
selList.append(name);
QModelIndexList indexList = model.match(model.index(0, 0), Qt::DisplayRole, selList.first());
QModelIndex selectedIndex(indexList.first());
listDBNumbers -> setCurrentIndex(selectedIndex);
}
AD, что это за слот? как туда попадаешь
connect(lineFindDB, SIGNAL(textEdited(const QString&)), this, SLOT(findLeftSN(const QString&)));
int cool = 100;
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)