QML QT Как добавить listviewmodel в listviewmodel - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть список в qml, внутри которого у меня есть другой список, мне нужна помощь для вставки содержимого этого второго списка, в приведенном ниже коде есть текущая форма, которая пыталась.

Код ниже был сделан на основе кода, доступного в самой документации QT

Мне нужно добавить контент в модель ["серверы"], я уже пробовал некоторые вещи, но ничего не делал

спасибо за прослушивание!

class RuleList : public QObject{
    Q_OBJECT
public:
    explicit RuleList(QObject *parent = nullptr): QObject(parent){
        QList<ServeItem*> current_server_list;
        current_server_list.append(new ServeItem{"kakatua1",110});
        current_server_list.append(new ServeItem{"kakatua1",110});
        current_server_list.append(new ServeItem{"kakatua1",110});
        current_server_list.append(new ServeItem{"kakatua1",110});

        RuleItem currentItem;
        currentItem.country = "empty country2";
        currentItem.expand = true;
        currentItem.flag = "empty flag";
        currentItem.servers = current_server_list;

        m_item_list.append(currentItem);
        m_item_list.append(currentItem);
        m_item_list.append(currentItem);
    }
    QVector<RuleItem> items() const{ return m_item_list; }
    bool setItemAt(int index, const RuleItem& item){
        if (index < 0 || index >= m_item_list.size())
            return false;

        const RuleItem& oldItem = m_item_list.at(index);
        if(item.country == oldItem.country && item.expand == oldItem.expand && item.flag == oldItem.flag)
            return false;

        m_item_list[index] = item;
        return true;
    }

signals:
    void preItemAppended();
    void postItemAppended();

    void preItemRemoved(int index);
    void postItemRemoved();

public slots:
    void appendItem(){
        emit preItemAppended();

        QList<ServeItem*> current_server_list;
        current_server_list.append(new ServeItem{"kakatua1",110});
        current_server_list.append(new ServeItem{"kakatua1",110});
        current_server_list.append(new ServeItem{"kakatua1",110});
        current_server_list.append(new ServeItem{"kakatua1",110});

        RuleItem currentItem;
        currentItem.country = "empty country";
        currentItem.expand = true;
        currentItem.flag = "empty flag";
        currentItem.servers = current_server_list;
        m_item_list.append(currentItem);

        emit postItemAppended();
    }
    void removeCompletedItems(){ }

private:
    QVector<RuleItem> m_item_list;
};

class RuleListModel : public QAbstractListModel{
    Q_OBJECT
    Q_PROPERTY(RuleList *list READ list WRITE setList)

public:
    explicit RuleListModel(QObject *parent = nullptr): QAbstractListModel(parent), m_rule_list(nullptr){}
    enum {
        countryRole = Qt::UserRole,
        flagRole,
        expandRole,
        serversRole
    };
    int rowCount(const QModelIndex &parent = QModelIndex()) const override {
        if (parent.isValid() || !m_rule_list)
            return 0;

        return m_rule_list->items().size();
    }
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override{
        if (!index.isValid() || !m_rule_list)
            return QVariant();

        const RuleItem currentItem = m_rule_list->items().at(index.row());
        if(role == countryRole)
            return QVariant(currentItem.country);
        else if(role == flagRole)
            return QVariant(currentItem.flag);
        else if(role == expandRole)
            return QVariant(currentItem.expand);
        else if(role == serversRole){
            //return QVariant::fromValue<QList<ServeItem*>>(currentItem.servers);
        }

        return QVariant();
    }
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override{
        if(!m_rule_list)
            return false;

        RuleItem currentItem = m_rule_list->items().at(index.row());
        if(role == countryRole)
            currentItem.country = value.toString();
        else if(role == flagRole)
            currentItem.flag = value.toString();
        else if(role == expandRole)
            currentItem.expand = value.toBool();
        else if(role == serversRole){
            //currentItem.servers = value.toList()
        }

        if(m_rule_list->setItemAt(index.row(),currentItem)){
            emit dataChanged(index, index, QVector<int>() << role);
            return true;
        }

        return false;
    }
    Qt::ItemFlags flags(const QModelIndex& index) const override{
        if (!index.isValid())
            return Qt::NoItemFlags;

        return Qt::ItemIsEditable;
    }
    virtual QHash<int, QByteArray> roleNames() const override{
        QHash<int, QByteArray> names;

        names[countryRole] = "country";
        names[flagRole] = "flag";
        names[expandRole] = "expand";
        names[serversRole] = "servers";

        return names;
    }
    RuleList *list() const{return m_rule_list;}
    void setList(RuleList *list)    {
        beginResetModel();

        if(m_rule_list)
            m_rule_list->disconnect(this);

        m_rule_list = list;

        if(m_rule_list){
            connect(m_rule_list, &RuleList::preItemAppended, this, [=](){
                const int index = m_rule_list->items().size();
                beginInsertRows(QModelIndex(), index, index);
            });

            connect(m_rule_list, &RuleList::postItemAppended, this, [=](){
                endInsertRows();
            });

            connect(m_rule_list, &RuleList::preItemRemoved, this, [=](int index){
                beginRemoveRows(QModelIndex(), index, index);
            });

            connect(m_rule_list, &RuleList::postItemRemoved, this, [=](){
                endRemoveRows();
            });
        }

        endResetModel();
    }
private:
    RuleList *m_rule_list;
};

struct ServeItem {
    QString name;
    qint32 ping;
};

struct RuleItem{
    QString country;
    QString flag;
    bool expand;
    QList<ServeItem*> servers;
};

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...