Я наверное присоединюсь к теме со своими проблемами... в общем леплю модель деревянную.
И так во всех ранее рассмотренных примерах данные забивались сначала в какой нибудь класс с QList (Куда засовывались потомки) - удобно! но Подразумевается одинаковое количество столбцов на всех уровнях (ну или наличие полей в классе... если я все правильно понял) Очень хочется этот класс не использовать.
В общем как выяснилось отсутствует понимание механизма взаимодействия представления с моделью.
Например что делают функции index
? и parent
?
Как опрашивается модель?
что есть на данном этапе
Таблица типа
oid; id; p_id; p_type; o_ex
76391; 1; 1; 1; 3
76392; 2; 1; 1; 3
76393; 3; 1; 1; 3
76394; 4; 2; 1; 3
76395; 5; 3; 1; 3
83764; 6; 3; 1; 3
oid - это от движка PG. еще не определился нужны будут или нет но решил пока оставить.
id - первичный ключ (уникальный).
p_id - число соответствующее первичному ключу предка.
p_type - это тип (по нему будет определятся какая таблица должна подтягиваться к o_ex)
o_ex - id внешней таблицы.
модель на данном этапе получилась такой.
Шапка
C++ (Qt)
#include <QAbstractItemModel>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QString>
#include <QDebug>
class QRVZTreeModel : public QAbstractItemModel
{
Q_OBJECT
public:
explicit QRVZTreeModel(QObject *parent = 0, int root = 0);
explicit QRVZTreeModel(int root = 0);
int root;
QVariant data( const QModelIndex& index, int role = Qt::DisplayRole ) const;
//Qt::ItemFlags flags( const QModelIndex& index ) const;
QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const;
QModelIndex index( int row, int col, const QModelIndex& index = QModelIndex() ) const;
QModelIndex parent( const QModelIndex& index ) const;
int rowCount( const QModelIndex& index = QModelIndex() ) const;
int columnCount( const QModelIndex& index = QModelIndex() ) const;
void reset();
void inc(){DXc++;qDebug()<<"DX - "<<DXc;}
private:
QSqlDatabase db;
QSqlQuery *STree;
int DXc;
signals:
public slots:
};
C плюшка
C++ (Qt)
QRVZTreeModel::QRVZTreeModel(QObject *parent, int root):QAbstractItemModel(parent){
}
QRVZTreeModel::QRVZTreeModel(int root){
this->root = root;
db = QSqlDatabase::database();
STree = new QSqlQuery();
STree->exec(QString("SELECT * FROM test.tr ORDER BY tr_id"));
STree->first();
DXc = 0;
}
QVariant QRVZTreeModel::data( const QModelIndex& index, int role) const{
if(role == Qt::DisplayRole){
if(index.isValid()){
STree->seek(index.internalId());
return STree->value(0);
}
}
return QVariant();
}
QVariant QRVZTreeModel::headerData( int section, Qt::Orientation orientation, int role) const{
if( orientation == Qt::Horizontal && role == Qt::DisplayRole && section == 0 )
return QVariant(QString("name_tree"));
return QVariant();
}
QModelIndex QRVZTreeModel::index( int row, int col, const QModelIndex& index) const{
int count_chi = 0;
int parent = root;
if(index.isValid()){
STree->seek(index.internalId());
parent = STree->value(0).toInt();
STree->first();
for(int i = 0; i < STree->size(); i++){
if (STree->value(1).toInt() == parent && STree->value(0)!=root){
if(count_chi == row)return createIndex(row, col, STree->at());
count_chi++;
}
STree->next();
}
return QModelIndex();
}else{
STree->first();
for(int i = 0; i < STree->size(); i++){
if (STree->value(1).toInt() == parent){
if(count_chi == row)return createIndex(row, col, STree->at());
count_chi++;
}
STree->next();
}
}
return createIndex(row, col, 0);
}
QModelIndex QRVZTreeModel::parent( const QModelIndex& index) const{
if(index.isValid()){
STree->seek(index.internalId());
if(STree->value(0).toInt() == root) return QModelIndex();
int parent = STree->value(1).toInt();
STree->first();
for(int i = 0; i < STree->size(); i++){
if (STree->value(0).toInt() == parent){
int pid = STree->value(1).toInt();
int rr = 0;
STree->first();
for(int j = 0; j < STree->size();j++){
if (STree->value(1).toInt() == pid){
if(STree->value(0).toInt() == parent && STree->value(1).toInt() == pid){
return createIndex(rr, 0, STree->at());
}
rr++;
}
STree->next();
}
}
STree->next();
}
}
return QModelIndex();
}
int QRVZTreeModel::rowCount( const QModelIndex& index) const{
int parent = root;
int count = 0;
if(index.isValid()){
STree->seek(index.internalId());
parent = STree->value(0).toInt();
STree->first();
for(int i = 0; i<STree->size(); i++ ){
if(STree->value(1) == parent && STree->value(0)!=root) count++;
STree->next();
}
return count;
}
STree->first();
for(int i = 0; i<STree->size(); i++ ){
if(STree->value(0) == root) count++;
STree->next();
}
return count;
}
int QRVZTreeModel::columnCount( const QModelIndex& index) const{
return 1;
}
void QRVZTreeModel::reset(){
STree->clear();
STree->exec(QString("SELECT * FROM test.tr ORDER BY tr_id"));
STree->first();
}
Она просто зацикливаться ни как не хотит увеличиваться номер строки передаваемый в функцию index
Что делать где лечить?
P.S. Заранее всем спасибо.