0

所以我终于到了可以在 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
}      

我试图从最初绑定到该项目的 GroupedDataModel 中获取“Person”对象......我不得不说我有点难过。通过数据库类中的简单插入方法将人员添加到 personDataModel:

personDataModel->insert(person);

然后将项目绑定到 QML 中的 ListView(上面的参考 1)。绑定一切正常,项目在列表中可见。我不知道现在如何从我通过 MultiSelectionMethod 发送的 QVariantList 中提取这些“Person”对象。

我的人班:

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,它方便地停在我的问题开始的地方。

4

2 回答 2

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

于 2013-07-10T12:55:23.230 回答
0

您是否正在寻找价值函数?

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

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

于 2013-06-18T19:31:10.933 回答