我使用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实例。我怎么能这样做?
答案 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()
}
}
}