BlackBerry перебирает список selectedItems

Итак, я НАКОНЕЦ-ТО дошел до того, что могу выбрать несколько элементов в ListView:

       ListView {
                id: lv_stuffs
                horizontalAlignment: HorizontalAlignment.Fill

                dataModel: _app.personDataModel //REFERENCE 1

                multiSelectAction: MultiSelectActionItem {
                }

                multiSelectHandler {
                    actions: [
                        // Add the actions that should appear on the context menu
                        // when multiple selection mode is enabled
                        ActionItem {
                            title: "Search for stuffs"                            
                            onTriggered: {                                    
                                _app.search(lv_stuffs.selectionList());
                            }       
       ...     

И я отправляю этот список выбора в свой метод поиска:

void ApplicationUI::search(const QVariantList &list)
{
    alert(QString("%1 items selected").arg(list.length()));
    alert(((Person)list.at(0)).firstName);//<---- THIS IS THE PROBLEM
}      

Я пытаюсь получить объект "Person" из GroupedDataModel, который изначально был привязан к элементу... и я должен сказать, что я более чем в тупике. Человек добавляется в personDataModel с помощью простого метода вставки в классе базы данных:

personDataModel->insert(person);

затем элементы привязываются к ListView в QML (ССЫЛКА 1 выше). С привязкой все в порядке, и элементы видны в списке. Чего я не могу понять, так это того, как теперь извлечь эти объекты «Person» из QVariantList, который я отправил через MultiSelectionMethod.

Мой класс человека:

Person::Person(QObject *parent) : QObject(parent){}

Person::Person(const QString &id, const QString &firstname, const QString &lastname, QObject *parent)
    : QObject(parent)
    , m_id(id)
    , m_firstName(firstname)
    , m_lastName(lastname)
{
}

QString Person::customerID() const
{
    return m_id;
}

QString Person::firstName() const
{
    return m_firstName;
}

QString Person::lastName() const
{
    return m_lastName;
}

void Person::setCustomerID(const QString &newId)
{
    if (newId != m_id) {
        m_id = newId;
        emit customerIDChanged(newId);
    }
}

void Person::setFirstName(const QString &newName)
{
    if (newName != m_firstName) {
        m_firstName = newName;
        emit firstNameChanged(newName);
    }
}

void Person::setLastName(const QString &newName)
{
    if (newName != m_lastName) {
        m_lastName = newName;
        emit lastNameChanged(newName);
    }
}

Я БОЛЕЗНЕННО следил за этим руководством здесь, https://developer.blackberry.com/cascades/documentation/ui/lists/list_view_selection.html, который удобно останавливается там, где начинается мой вопрос.


person Quintin Balsdon    schedule 15.06.2013    source источник


Ответы (2)


Возможно, вы ищете функцию ценности?

void ApplicationUI::search(const QVariantList &list)
{
    alert(QString("%1 items selected").arg(list.length()));
    alert(((Person)list.value(0)).firstName);
}   

(синтаксис извлечения значения firstName может быть не тут, зависит от вашей реализации)

person TheSmurf    schedule 18.06.2013
comment
Спасибо, но это не работает - я дошел до: QVariant nlist= personDataModel-›data(list.at(0).toList()); qDebug() ‹‹ Список: ‹‹ nlist; Результаты в списке: QVariant(QObject*, Person(0x857c310)) Но я не могу получить элементы из QVariant - person Quintin Balsdon; 19.06.2013
comment
Используйте функцию value() для QVariant, который у вас есть. Это должно дать вам задержанного человека. - person TheSmurf; 20.06.2013
comment
Это ЗВУЧИТ правильно, но значение является шаблоном, поэтому я должен сказать что-то вроде QVariant tlist = personDataModel-›data(list.at(0).toList()); Person* selectedPeople = tlist.value‹Person*›(); И я получаю сообщение об ошибке: 'qt_metatype_id' не является членом 'QMetaTypeId‹Person*›' Теперь, прежде чем вы просто загуглите эту ошибку и выдадите мне результаты - я понятия не имею, куда поместить эти строки кода в классе def ( может быть, даже не в классе def) - может быть, даже не в тех строках кода. Почему, черт возьми, это так сложно? - person Quintin Balsdon; 21.06.2013

Ваш класс Person будет храниться в файле QVariant. Для этого Qt должен сгенерировать некоторый код, специфичный для вашего класса. Это можно сделать, добавив это сразу после определения вашего класса в заголовочный файл, например: Q_DECLARE_METATYPE(Person). Подробнее об этом можно прочитать здесь: http://qt-project.org/doc/qt-4.8/qmetatype.html#Q_DECLARE_METATYPE

Теперь, чтобы извлечь значение как объект Person, вы можете использовать QVariant::value<T>() (http://qt-project.org/doc/qt-4.8/qvariant.html#value): alert(list.at(0).value<Person>().firstName());

person Marc Plano-Lesay    schedule 10.07.2013