单击QML List项时通知模型项

时间:2018-04-29 11:33:10

标签: c++ qt qml

我使用QML开发了一个小型qt应用程序。我想在那里显示可点击的项目列表。我有从QObject派生的IssueHolder类来表示要在那里可视化的项目。我为这些项目创建了一个模型

class IssuesModel : public QAbstractListModel
{
    Q_OBJECT

public:
    IssuesModel(QObject *parent = 0);

    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

    const QList<IssueHolder*>& issues() const { return _issues; }

protected:
    QHash<int, QByteArray> roleNames() const override;

private: //Members
    QList<IssueHolder*> _issues;
};

在视图类中,我将模型设置为qml部分,如此

 _view = new QQuickView;    
_mainSetModel = new IssuesModel(this);
_view->rootContext()->setContextProperty("mainSetModel", _mainSetModel);

之后我在QML文件中创建了委托

 ListView {
    // Some properties here

    model: mainSetModel

    delegate: Item {
        // Some properties here

        IssueDelegate {                
            id: issuesDelegate

            // Some properties here

            signal pressed()

            MouseArea {
                onClicked: { issuesDelegate.pressed(); }
            }
        }
    }
}

我想点击列表项但我不想在QML文件中实现应用程序逻辑。所以我想对委托点击动作做出反应,这样如果用户点击我的列表视图中的某个项目,将通知相应的IssueHolder实例。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您可以在模型中声明IssueHolder角色:

enum {
    IssueHolderRole = Qt::UserRole
};

然后,重新实现roleNames()

QHash<int, QByteArray> IssuesModel::roleNames() const
{
    QHash<int, QByteArray> names;
    names.insert(IssueHolderRole, "issueHolder");
    return names;
}

您还需要在data()功能中考虑新角色。文档中有很多如何执行此操作的示例,但其主旨是:

if (role == IssueHolderRole)
    return QVariant::fromValue(_issues.at(index.row()));

IssueHolder中,声明一个可调用的函数或插槽:

Q_INVOKABLE void doStuff();

在您的代理中,回复点击:

delegate: Item {
    // Some properties here

    IssueDelegate {                
        id: issuesDelegate

        // Some properties here

        MouseArea {
            onClicked: model.issueHolder.doStuff()
        }
    }
}