У меня есть список в 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;
};