我是 Qt 新手,所以请多多包涵。
我已经成功地从 StringList 和 Object* 的 QList 填充 ListView
我现在正在努力的是使用 C++ 中定义的派生 QAbstractListModel 的类在 QML 中填充 ListView。
这是我的 CPP 类的原型:
class MessageListEntryModel : public QAbstractListModel
{
Q_OBJECT
public:
enum eMLERoleTypes
{
MLERT_MSG = Qt::UserRole+1,
MLERT_COLOR
};
MessageListEntryModel(QObject* parent=0);
virtual ~MessageListEntryModel();
void AddEntry(QString aMessage, QColor aColor);
// pure virtuals implementations
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const ;
int columnCount(const QModelIndex &parent = QModelIndex()) const ;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &child) const ;
QHash<int,QByteArray> roleNames();
private:
QList<MessageEntry*> m_vpMessages;
MessageEntry 是一个简单的类,它包含 2 个成员、一个 QColor 和一个 QString(该类不扩展 QObject)。
我必须实现所有上述功能,因为它们在底层类中是纯虚拟的(这正常吗?到目前为止,在教程/示例中人们只提到了角色名称和数据)。
roleNames 和 data 的实现如下:
QHash<int,QByteArray> MessageListEntryModel::roleNames()
{
QHash<int,QByteArray> rez;
rez[MLERT_MSG]="message";
rez[MLERT_COLOR]="messagecolor";
return rez;
}
QVariant MessageListEntryModel::data(const QModelIndex &index, int role) const
{
qDebug()<<" Data asked for "<<index.row()<<" and role "<<role;
if (index.row()<0 || index.row()>=m_vpMessages.size())
{
return QVariant();
}
MessageEntry* entry = m_vpMessages[index.row()];
if (role == MLERT_MSG)
{
return QVariant::fromValue(entry->message);
} else if (role == MLERT_COLOR)
{
return QVariant::fromValue(entry->messageColor);
}
// should be unreachable code
return QVariant();
}
列表视图的 QML 部分是这样的:
ListView {
id: quickMessageListdata
model: quickListModel
delegate: Rectangle {
width: 400
height: 25
color:"#000000"
Text{
text: model.message
color: model.messagecolor
}
}
到目前为止,这是我对如何在 CPP 和 QML 中实现事物的理解。为了链接这两者,我使用以下代码:
MessageListEntryModel* model =new MessageListEntryModel();
// Add various entries
...
// assign model in QML
m_pViewRef->rootContext()->setContextProperty("quickListModel",model);
使用上面的代码,运行时 ListView 中不显示任何内容,并且出现以下错误:
Unable to assign [undefined] to QString
Unable to assign [undefined] to QColor
我还在注册要导出到 QML 的模型类(不知道这是否有必要):
qmlRegisterType<MessageListEntryModel> ("dlti.exported",1,0,"MessageListEntryModel");
所以很明显,要么我误解了正确使用 QAbstractListItem 派生类,要么我错过了一个简单的重要关键信息。
我将不胜感激一些指向一些相关示例/教程的指针(其中还向您展示了如何在 QML 中正确访问模型中的数据,因为我注意到在 CPP 中它永远不会通过数据函数)。
另请注意,我使用的是 qt5 ,因此 qt4.8 样本无法解决问题。
编辑
经过长时间的挫折,我终于解决了这该死的东西出了什么问题:
我的 roleNames 函数签名错误!重载的正确签名是:
protected :
QHash<int,QByteArray> roleNames() const;
请注意 protected 和 const 修饰符。
以正确的方式声明函数后,一切正常。
如需进一步通知,实现 data 和 rowCount 就足够了:)。
谢谢您的帮助。我会接受 BaCaRoZzo 的回答,因为我只是在查看示例中的代码后才弄清楚这一点。
附带说明一下,它适用于 message 和 model.message。