Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Нахождение нужного элемента в QListView

Автор: AD 13.11.2008, 17:56

Вопрос такой: в эдит-поле вводится сериный номер, чуть ниже список серийных номеров, выбранных из БД. Как заставить при введении цифры номера, фокус перемещался на первый найденный элемент. Это общая задача.

Более конкретно: у меня есть имя серийного номера, как зная это имя получить QModelIndex по которому я смогу определить элемент в QListView? Буду благодарен за любую помощь.

Автор: AD 14.11.2008, 13:08

Вроде ведь многие работали с таблицами, с БД, с модель-представление. Неужели никто не сталкивался с подобными задачами? Мне кажется такого рода задачка в первую очередь встанет. По заданному значению параметра найти индекс модели. Помогите, пожалуйста.

Автор: Litkevich Yuriy 14.11.2008, 13:48

AD, ищи по форуму, про автоподстановку в комбобоксе, недавно было, механизм тотже

Автор: AD 14.11.2008, 14:09

Цитата(Litkevich Yuriy)
AD, ищи по форуму, про автоподстановку в комбобоксе, недавно было, механизм тотже

Искал по этим словам. Не нашел. Дай, пожалуйста, ссылку! :) Заранее спасибо.

Автор: AD 14.11.2008, 15:14

Блин, я реально не могу найти нужную тему. А мне это очень необходимо!!! :(

Автор: Litkevich Yuriy 14.11.2008, 15:34

http://www.forum.crossplatform.ru/index.php?showtopic=1560

Автор: AD 14.11.2008, 15:55

Не очень-то подходит. QComboBox имеет довольно удобные функции, которых нет в QListView! Потом в данном примере не указывается как фокус на нем установить. В QComboBox просто выбирается заданный элемент, ЕСЛИ НА НЕГО НАЖАТЬ!!!

Автор: Litkevich Yuriy 14.11.2008, 16:51

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

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

Т.о. тебе указан путь к решению задачи, готового кода скорее всего нет.

Автор: AD 14.11.2008, 16:53

На англоязычном форуме подсказали правильное решение. :) Данная штука решается с помощью
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 14.11.2008, 17:00

AD, что это за слот? как туда попадаешь

Автор: AD 14.11.2008, 17:28

Цитата(Litkevich Yuriy @ 14.11.2008, 17:00) *
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)