Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нахождение нужного элемента в QListView
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
AD
Вопрос такой: в эдит-поле вводится сериный номер, чуть ниже список серийных номеров, выбранных из БД. Как заставить при введении цифры номера, фокус перемещался на первый найденный элемент. Это общая задача.

Более конкретно: у меня есть имя серийного номера, как зная это имя получить QModelIndex по которому я смогу определить элемент в QListView? Буду благодарен за любую помощь.
AD
Вроде ведь многие работали с таблицами, с БД, с модель-представление. Неужели никто не сталкивался с подобными задачами? Мне кажется такого рода задачка в первую очередь встанет. По заданному значению параметра найти индекс модели. Помогите, пожалуйста.
Litkevich Yuriy
AD, ищи по форуму, про автоподстановку в комбобоксе, недавно было, механизм тотже
AD
Цитата(Litkevich Yuriy)
AD, ищи по форуму, про автоподстановку в комбобоксе, недавно было, механизм тотже

Искал по этим словам. Не нашел. Дай, пожалуйста, ссылку! :) Заранее спасибо.
AD
Блин, я реально не могу найти нужную тему. А мне это очень необходимо!!! :(
Litkevich Yuriy
тут
AD
Не очень-то подходит. QComboBox имеет довольно удобные функции, которых нет в QListView! Потом в данном примере не указывается как фокус на нем установить. В QComboBox просто выбирается заданный элемент, ЕСЛИ НА НЕГО НАЖАТЬ!!!
Litkevich Yuriy
AD, в указанной теме говорилось об автозавершении, т.е. есть комбобокс, внего вводятся символы, а в выподающем списке показывается наиболееблизкое совпадение.

у тебя все тоже самое, только поле в вода и список, список в комбобоксе использует концепцию модель/представление, а для авто завершения QCompleter который всю механнику совпадений и связь с Селекшнмодель берет на себя.

Т.о. тебе указан путь к решению задачи, готового кода скорее всего нет.
AD
На англоязычном форуме подсказали правильное решение. :) Данная штука решается с помощью
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);
}
Litkevich Yuriy
AD, что это за слот? как туда попадаешь
AD
Цитата(Litkevich Yuriy @ 14.11.2008, 17:00) *
AD, что это за слот? как туда попадаешь

Вот так туда попадаю.
connect(lineFindDB, SIGNAL(textEdited(const QString&)), this, SLOT(findLeftSN(const QString&)));



int cool = 100;


Если по-русски сказать, то при изменении текста в эдит поле, куда вводится серийный, который хотят найти.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2021 IPS, Inc.