BlackBerry迭代selectedItems列表

时间:2013-06-15 14:34:51

标签: blackberry-cascades

所以我最终已经达到了可以在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
}      

我正在努力获得&#34; Person&#34;最初绑定到项目的GroupedDataModel中的对象...我不得不说我不仅仅是有点难过。通过数据库类中的简单插入方法将此人添加到personDataModel:

personDataModel->insert(person);

然后将项目绑定到QML中的ListView(上面的参考文献1)。绑定完全正常,项目在列表中可见。我无法弄清楚的是现在如何提取这些&#34; Person&#34; 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一直非常轻松,这可以方便地停在我的问题开始的地方。

2 个答案:

答案 0 :(得分:0)

您是否正在寻找价值功能?

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

(firstName值的提取语法可能不正确,取决于您的实现)

答案 1 :(得分:0)

您的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());