Я реализовал свою собственную модель для списка пользователей, присутствующих в канале. Это работает нормально, если модель заполнена и данные прочитаны, что не работает, так это живое обновление, если что-то новое добавлено, оно появляется только после событие изменения размера.
bool UserModel::insertUser( QString channelId, QSharedPointer<RocketChatUser> user )
{
auto values = userMap.values( channelId );
int index = values.count();
auto qIndex = QModelIndex();
if ( channelId == current ) {
beginInsertRows( qIndex, index, index );
}
userMap.insert( channelId, user );
if ( channelId == current ) {
endInsertRows();
}
}class UserModel: public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(QString currentChannel READ getCurrent WRITE setCurrent NOTIFY currentChannelChanged)
enum UserRoles {
UserName = Qt::UserRole + 1,
UserId
};
public:
UserModel( QObject *parent = 0 );
int rowCount( const QModelIndex &parent = QModelIndex() ) const;
QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const;
bool insertUser(QString,QSharedPointer<RocketChatUser>);
QString getCurrent() const;
void setCurrent(const QString &value);
void onCurrentChannelChanged(const QString &newText);
protected:
QHash<int, QByteArray> roleNames() const;
QSet<QString> duplicateCheck;
QMultiMap<QString, QSharedPointer<RocketChatUser>> userMap;
QString current;
signals:
void currentChannelChanged(const QString &newText);
};
Текущий канал существует для хранения всех пользователей в мультикарте, ключом которых является идентификатор канала, и для возврата только тех, кто принадлежит каналу по соображениям производительности.
Он создан таким образом:
UserModel userModel;
context->setContextProperty("userModel",&userModel);
И QML выглядит так:
Drawer {
z: 9
width: Math.min(window.width, window.height) / 3 * 2
height: window.height
edge: Qt.LeftEdge
ListView {
anchors.fill: parent
spacing: 1
header: ToolBar {
Text {
text: qsTr("Users in channel")
anchors.centerIn: parent
}
width: parent.width - 1
}
id: userListView
model: userModel
delegate: RowLayout {
width: parent.width
Button {
anchors.fill: parent
text: model.username
}
/*BusyIndicator{
id: loadingUserIndicator
anchors.centerIn: parent
}*/
}
Component.onCompleted: {
userModel.currentChannel = channelView.currentChannel
}
}
}
Задача ещё не решена.
Других решений пока нет …