新手一枚,根据官方文档和一些大神的说法做了以下关于lisview的实现。但是无法显示(简单的text能显示)。
环境:QT5.6.0 和 vs 2013。
// qmember.h
#ifndef QMEMBERITEM_H
#define QMEMBERITEM_H
#include <QObject>
#include <QQueue>
class QMemberItem : public QObject
{
Q_OBJECT
Q_PROPERTY(QString id READ uid WRITE setUid NOTIFY uidChanged)
Q_PROPERTY(QString image READ uimage WRITE setUimage NOTIFY uimageChanged)
public:
explicit QMemberItem(QObject *parent = 0);
// user id
QString uid();
void setUid(const QString& id);
// user image
QString uimage();
void setUimage(const QString& image);
signals:
void uidChanged();
void uimageChanged();
public slots:
private:
QString m_uid;
QString m_uimage;
};
class QMemberList : public QObject
{
Q_OBJECT
public:
explicit QMemberList(QObject *parent = 0);
signals:
void memberCountChanged(int arg);
void memberIncrease(QMemberItem* item);
void memberReduce(int index);
public slots:
void addMember(QMemberItem* item);
void removeMember(const QString& uid);
private:
QQueue<QMemberItem*> m_queueMembers;
};
#endif // QMEMBERITEM_H
// qmember.cpp
#include "qmember.h"
QMemberItem::QMemberItem(QObject *parent) : QObject(parent)
{
}
QString QMemberItem::uid()
{
return m_uid;
}
void QMemberItem::setUid(const QString& id)
{
m_uid = id;
}
QString QMemberItem::uimage()
{
return m_uimage;
}
void QMemberItem::setUimage(const QString& image)
{
m_uimage = image;
}
QMemberList::QMemberList(QObject *parent) : QObject(parent)
{
m_queueMembers.clear();
QMemberItem item_1;
item_1.setUid("0001");
addMember(&item_1);
}
void QMemberList::addMember(QMemberItem* item)
{
if(NULL != item && !m_queueMembers.contains(item))
{
m_queueMembers<<item;
emit memberCountChanged(m_queueMembers.count());
emit memberIncrease (item);
}
}
void QMemberList::removeMember(const QString& uid)
{
for(int i=0;i<m_queueMembers.count();++i){
QMemberItem* item = m_queueMembers;
if(NULL != item && item->uid() == uid)
{
m_queueMembers.removeAt(i);
emit memberCountChanged (m_queueMembers.count ());
emit memberReduce (i);
break;
}
}
}
// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include <QQuickView>
#include "qmember.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
qmlRegisterType<QMemberItem>("the.myMemberItem", 1, 0, "QMemberItem");
QMemberList memlst;
QQuickView view;
view.engine()->rootContext()->setContextProperty("memlst", &memlst);
view.setSource(QUrl(QStringLiteral("qrc:/main.qml")));
view.show();
return app.exec();
}
// main.qml
import QtQuick 2.4
import QtQuick.Window 2.2
import the.myMemberItem 1.0
Item{
id:member_list
visible: true
width:720
height:640
// 这个text能显示 /*
Text{
text:"Hello World."
}*/
// 这个listview无法显示
ListModel{
id: mymodel
}
Component {
id:myDelegate
Item{
id: item_root
height: 120
width: 120
property QMemberItem myinfo:obj_info // 这个不懂,可能是错误
Image{
id: image_avatar
width: 120
height: 90
source:myinfo.uimage()
}
Text{
x:20
y:image_avatar.height + 5
text: myinfo.uid()
}
}
}
ListView{
id: list_member
anchors.fill: parent
width:700
height: 600
model: mymodel
delegate:myDelegate
}
Connections{
target: memlst
onMemberIncrease:{//增加item
mymodel.append({"obj_info": info})
}
onMemberReduce:{//移除item
mymodel.remove(index)
}
}
}
问题是:当我在qmember.cpp 中 类 QMemberList初始化队列时,并进行调用addMember进行添加人员,在此时给QML发送一个添加人员的信号,进行添加人员信息,疑惑在于不懂在接收这个数据,即Connections的onMemberIncrease方法中怎么处理,接收的数据,该怎么填充对应的text或image的source。希望懂得大神,解一下惑。