QModelIndex ObjectTreeModel::index(int row, int column, const QModelIndex &parent ) const{QObject *parentObject;if( !parent.isValid() )parentObject = m_root;elseparentObject = static_cast<QObject*>( parent.internalPointer() );if( row >= 0 && row < parentObject->children().count() )return createIndex( row, column, parentObject->children().at( row ) );elsereturn QModelIndex();}
QVariant AutoModel::data(const QModelIndex &index, int role) const{ if (!index.isValid() || !(role == Qt::EditRole || role == Qt::DisplayRole)) return QVariant(); int level = 0; QModelIndex temp_index = index; while (temp_index.parent().isValid()) { level++; temp_index = temp_index.parent(); } // марки автомобилей if (level == 0) { if (index.row() >= brands->count()) { int start = brands->count(); // с какой строки подкачивать int count = index.row()-brands->count()+1; // сколько строк подкачивать brands->append(BrandsGetDB(start,count)); } if (index.row() >= brands->count()) return QVariant(); return QVariant::fromValue(brands->at(index.row())); } else // модели автомобилей if (level == 1) { int brand_id = brands->at(index.parent().row()).id; if (index.row() >= models->take(brand_id).count()) { int start = models->take(brand_id).count(); // с какой строки подкачивать int count = index.row()-models->take(brand_id).count()+1; // сколько строк подкачивать models->take(brand_id).append(ModelsGetDB(start,count,brand_id)); } if (index.row() >= models->take(brand_id).count()) return QVariant(); return QVariant::fromValue(models->take(brand_id).at(index.row())); }}
namespace AUTO{ struct Brand { int id; QString name; }; struct Model { int id; QString name; }; struct Engine { int id; QString name; int KW; };}typedef QList<AUTO::Model> QListModels;typedef QList<AUTO::Engine> QListEngines;brands = new QList<AUTO::Brand>;models = new QMap<int,QListModels>;engines = new QMap<int,QListEngines>;
enum TreeItemTypes { Root, Mark, Model};class TreeItem : public QObject{ Q_OBJECTpublic:// LIFECYCLE /** Default constructor. */ TreeItem(TreeItemTypes type, TreeItem* parent = 0); virtual ~EGTreeItem(void);// OPERATORS// OPERATIONS// ACCESS// INQUIRY virtual int subItemsCount() const {return 0;} virtual int childCount() const; virtual int columnCount() const; void appendChild(TreeItem* child); TreeItem* takeLast(); virtual void deleteChildren(); virtual TreeItemTypes getType() {return type;} TreeItem* child(int row); TreeItem* parent(); virtual QVariant data(int column) const; int row() const; virtual bool setData(int column, const QVariant &value); virtual void expand(){;}public slots:protected: TreeItemTypes type; QList<TreeItem*> childItems; TreeItem* parentItem; QList<QVariant> itemData;};