Guest User

try to construct a customized model/view from database

a guest
Feb 6th, 2015
349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.60 KB | None | 0 0
  1. // classeur.h (a classeur is french word for "binder" this object represent a container for files models
  2. // inside the QTreeView of binders, when i will click on a binder, it will show me the files/directories contents
  3. // in an other QTreeView at right side on the widget
  4. #ifndef CLASSEUR_H
  5. #define CLASSEUR_H
  6.  
  7. #include <QObject>
  8. #include <QSqlDatabase>
  9. #include <QStandardItem>
  10. #include <QStandardItemModel>
  11. #include "user_controler.h"
  12. #include "Files/files_model.h"
  13.  
  14.  
  15. struct classeur_infos {
  16. int id;
  17. int id_parent;
  18. QString name;
  19. QString comment;
  20. QStandardItem *files_root;
  21. Files_Model *files_model;
  22. };
  23.  
  24. // je dois créer un lien entre les infos statics et les données de fichiers.
  25.  
  26. class Classeur : public QObject
  27. {
  28. Q_OBJECT
  29. public:
  30. explicit Classeur(QObject *parent = 0,
  31. const int &id = 0,
  32. const int &id_parent = 0);
  33. ~Classeur();
  34. classeur_infos Classeur_Info;
  35. void setInfos(QString name, QString comment);
  36. void setComment(QString comment);
  37. void add_file(QList<int> tree_posit, QStandardItem row_items);
  38. void edit_file(QList<int> tree_posit, int column,
  39. QStandardItem *item, QString content = "");
  40. void del_files(QList<int> tree_posit);
  41. void read_file_item(QStandardItem *item);
  42. void read_file_posit(QList<int> tree_posit);
  43. void read_file_index(QModelIndex index);
  44.  
  45. private:
  46. user_controler *user;
  47.  
  48. signals:
  49.  
  50. public slots:
  51. };
  52.  
  53. #endif // CLASSEUR_H
  54.  
  55. // here is the source file for this object:
  56.  
  57. #include "classeur.h"
  58.  
  59. #include <QDebug>
  60. #include <QSqlDatabase>
  61. #include <QSqlQuery>
  62. #include <QSqlError>
  63. #include <QMessageBox>
  64.  
  65.  
  66. Classeur::Classeur(QObject *parent, const int &id,
  67. const int &id_parent) : QObject(parent)
  68. {
  69. // user = user_controler::getInstance();
  70. user->initdb();
  71. this->Classeur_Info.id = id;
  72. this->Classeur_Info.id_parent = id_parent;
  73. Classeur_Info.files_model = new Files_Model();
  74. // QStringList headers_files;
  75. // headers_files << tr("Répertoire") << tr("Fichier")
  76. // << tr("Poids") << tr("Description") << tr("full");
  77. Classeur_Info.files_root = Classeur_Info.files_model->invisibleRootItem();
  78. // Classeur_Info.files_model->setColumnCount(4);
  79. // Classeur_Info.files_model->setHorizontalHeaderLabels(headers_files);
  80. }
  81.  
  82. Classeur::~Classeur()
  83. {
  84.  
  85. }
  86.  
  87. void Classeur::setInfos(QString name, QString comment) {
  88. this->Classeur_Info.name = name;
  89. this->Classeur_Info.comment = comment;
  90. }
  91.  
  92. void Classeur::setComment(QString comment) {
  93. this->Classeur_Info.comment = comment;
  94. }
  95.  
  96. void Classeur::add_file(QList<int> tree_posit, QStandardItem row_items) {
  97.  
  98. }
  99.  
  100. void Classeur::edit_file(QList<int> tree_posit, int column,
  101. QStandardItem *item, QString content) {
  102.  
  103. }
  104.  
  105. void Classeur::del_files(QList<int> tree_posit) {
  106.  
  107. }
  108.  
  109. void Classeur::read_file_item(QStandardItem *item) {
  110.  
  111. }
  112.  
  113. void Classeur::read_file_posit(QList<int> tree_posit) {
  114.  
  115. }
  116.  
  117. void Classeur::read_file_index(QModelIndex index) {
  118.  
  119. }
  120.  
  121. // classeur_treeview.h is the header file for customize the view of my QTreeView for binders
  122. // consider that the content of the struct is totaly wrong, because use QModelIndex like this is bad
  123. // and not possible too... the idea was to memorize datas from database inisde variables contains inside a struct,
  124. // but this idea is bad... i have to change this.
  125.  
  126. #ifndef CLASSEURS_TREEVIEW_H
  127. #define CLASSEURS_TREEVIEW_H
  128. #include "Classeurs/classeur.h"
  129. #include "Classeurs/classeurs_model.h"
  130.  
  131. #include <QtGui>
  132. #include <QObject>
  133. #include <QTreeView>
  134. #include <QStandardItem>
  135. #include <QMenu>
  136.  
  137.  
  138. struct infos_generales_classeurs {
  139. QMap<QModelIndex, int> id; // index at col0: id
  140. QHash<QModelIndex, int> id_parent; // index at col0: id_parent
  141. QHash<int, QModelIndex> index_from_id; // id: index
  142. QHash<int, QModelIndex> index_from_id_parent; // id_parent: index
  143. QStandardItem *root_classeur;
  144. // Classeurs_Model *classeurs_model;
  145. QStandardItemModel *classeurs_model;
  146. QHash<QModelIndex, Classeur*> my_classeurs; // index at col0: Classeur
  147. }; // structure static de log des classeurs à insérer dans "Structures"
  148.  
  149.  
  150. class Classeurs_treeView : public QTreeView
  151. {
  152. Q_OBJECT
  153.  
  154. public:
  155. Classeurs_treeView(const QStringList &header, QWidget *parent);
  156. ~Classeurs_treeView();
  157. infos_generales_classeurs Classeurs;
  158. void add_classeur(const QString &name = "",
  159. const QString &comment = "",
  160. const QString &id_parent = "",
  161. QModelIndex const &parent = QModelIndex());
  162. void populate(const QList<int> &id_classeur,
  163. const QList<int> &id,
  164. const QList<int> &id_parent,
  165. const QStringList &name,
  166. const QStringList &comment);
  167. // Classeurs_Model *getModel();
  168. QStandardItemModel *getModel();
  169.  
  170. protected:
  171. QMenu *menu_middle;
  172. QMenu *menu_right;
  173. QAction *supprimer;
  174. int next_id;
  175. void delete_row();
  176.  
  177. protected slots:
  178. void mouseReleaseEvent ( QMouseEvent * event );
  179.  
  180. signals:
  181. void clicked(QModelIndex);
  182. void delete_classeur(QModelIndexList list_indexs);
  183.  
  184. };
  185.  
  186.  
  187. #endif // CLASSEURS_TREEVIEW_H
  188. // here is my source file of classeur_treeview.cpp
  189. #include "classeurs_treeview.h"
  190. #include "classeur.h"
  191. #include <QMessageBox>
  192.  
  193. //infos_generales_classeurs Classeurs_treeView::Classeurs;
  194.  
  195. Classeurs_treeView::Classeurs_treeView(QWidget *parent) {
  196. // Classeurs.classeurs_model = new Classeurs_Model;
  197. Classeurs.classeurs_model = new QStandardItemModel;
  198. QStringList headers_classeurs;
  199. headers_classeurs << tr("Classeurs") << tr("Description") << tr("id") <<tr("classeur_id");
  200. if (Classeurs.classeurs_model->rowCount() == 0)
  201. Classeurs.root_classeur = Classeurs.classeurs_model->invisibleRootItem();
  202. Classeurs.classeurs_model->setColumnCount(4);
  203. Classeurs.classeurs_model->setHorizontalHeaderLabels(headers_classeurs);
  204. // this->setModel(Classeurs.classeurs_model);
  205. this->setAcceptDrops(false);
  206. this->setSelectionMode(QAbstractItemView::ExtendedSelection);
  207. this->setColumnHidden(2, true);
  208. this->setColumnHidden(3, true);
  209. supprimer = new QAction(tr("Supprimer"), this);
  210. QObject::connect(supprimer, &QAction::triggered, this, &Classeurs_treeView::delete_row);
  211. }
  212.  
  213. Classeurs_treeView::~Classeurs_treeView()
  214. {
  215.  
  216. }
  217. //****** Methods "get" ***********************************************
  218. QStandardItemModel *Classeurs_treeView::getModel() {
  219. return Classeurs.classeurs_model;
  220. }
  221.  
  222.  
  223. //******* add classeurs methods ****************************************
  224. void Classeurs_treeView::add_classeur(const QString &name,
  225. const QString &comment,
  226. const QString &id_parent,
  227. QModelIndex const &parent) { // ajoute un classeur
  228. next_id = (!Classeurs.id.isEmpty()) ? Classeurs.id.last() + 1 : 1;
  229. QList<QStandardItem*> new_row;
  230. new_row.append(new QStandardItem(name));
  231. new_row.append(new QStandardItem(comment));
  232. new_row.append(new QStandardItem(QString("%1").arg(next_id)));
  233. if(id_parent == "") {
  234. new_row.append(new QStandardItem("0"));
  235. Classeurs.classeurs_model->appendRow(new_row); }
  236. else { // sinon, + au parent
  237. new_row.append(new QStandardItem(id_parent));
  238. QStandardItem *the_parent = Classeurs.classeurs_model->itemFromIndex(parent);
  239. the_parent->appendRow(new_row); }
  240.  
  241. }
  242.  
  243. void Classeurs_treeView::populate(const QList<int> &id_classeur,
  244. const QList<int> &id,
  245. const QList<int> &id_parent,
  246. const QStringList &name,
  247. const QStringList &comment) {
  248. for(int i = 0; i<id.count(); i++) {
  249. QList<QStandardItem*> new_row;
  250. new_row.append(new QStandardItem(name[i]));
  251. new_row.append(new QStandardItem(comment[i]));
  252. new_row.append(new QStandardItem(QString("%1").arg(id[i])));
  253. new_row.append(new QStandardItem(QString("%1").arg(id_classeur[i])));
  254. if (id_parent[i] == 0) // si 0 parent, + ligne à la base
  255. Classeurs.classeurs_model->appendRow(new_row);
  256. else { // sinon ajoute au parent
  257. QModelIndex index_parent = Classeurs.index_from_id_parent[id_parent[i]];
  258. QStandardItem *the_parent = Classeurs.classeurs_model->itemFromIndex(index_parent);
  259. the_parent->appendRow(new_row); } }
  260. }
  261. //****** Delete classeurs **************************************************
  262. void Classeurs_treeView::delete_row() { // peut supprimer une ou plusieurs sélections et leurs fils
  263. int answer = QMessageBox::question(this,"SUPPRIMER",
  264. tr("Voulez vous supprimer le(s) classeur(s) ?"),
  265. tr("Oui"), tr("Non"));
  266. if (answer == 0) { // si la réponse est "oui" j'efface le fichier ou le dossier sélectionné...
  267. emit delete_classeur(this->selectionModel()->selectedIndexes());
  268. }
  269. }
  270. //****** Event mouse click **************************************************
  271. void Classeurs_treeView::mouseReleaseEvent ( QMouseEvent * event ) {
  272. if(event->button() == Qt::RightButton) {
  273. menu_middle = new QMenu(this);
  274. if (this->indexAt(event->pos()).isValid()) {
  275. menu_middle->addAction(supprimer);
  276. menu_middle->popup(this->viewport()->mapToGlobal(event->pos())); } }
  277. if(event->button() == Qt::LeftButton)
  278. emit clicked(this->indexAt(event->pos()));
  279. }
  280.  
  281. // next, classeurs_model.h is my customized model from QAbstactItemModel, it has to interface data from database
  282. // and send signals when something is added or delete... i think i NO need delegate for this use...
  283. // but also, i think i have to call data from database iniside this model... but where and how to do it well ?
  284. // also, i would like to be able (just for learn, because it is not so necessary here) to make
  285. // the database request call depend of the viewport area (for limit the datas memory) and maybe also just call
  286. // first leve parnets and first child only, and then, at time for unroll (by click the arrow inside the View on
  287. // column 0), call the next level childs to show the dependencies datas too... (in fact, i think that if the tree
  288. // levels are big, i no need to show all in one time, but, step by step... right ?)
  289.  
  290. #ifndef CLASSEURS_MODEL_H
  291. #define CLASSEURS_MODEL_H
  292.  
  293. #include <QObject>
  294. #include <QAbstractItemModel>
  295. #include "Classeurs/classeur.h"
  296. #include "Classeurs/classeurs_treeview.h"
  297.  
  298.  
  299. class Classeurs_Model : public QAbstractItemModel
  300. {
  301. Q_OBJECT
  302.  
  303. public:
  304. explicit Classeurs_Model(Classeur *classeur = 0);
  305. ~Classeurs_Model();
  306. int columnCount(const QModelIndex &parent) const;
  307. int rowCount(const QModelIndex &parent) const;
  308. int totalRowCount(const QModelIndex &parent) const;
  309. QVariant data(const QModelIndex &index,
  310. int role) const;
  311. QModelIndex parent(const QModelIndex &child) const;
  312. QModelIndex index(int row,
  313. int column,
  314. const QModelIndex &parent) const;
  315. Classeur *getCurrentClasseur(QModelIndex &index);
  316. Files_Model *getCurrent_Files_model(QModelIndex &index);
  317.  
  318. protected:
  319. Classeur *m_classeur;
  320.  
  321. protected slots:
  322. void dataChanged (const QModelIndex &topLeft,
  323. const QModelIndex &bottomRight,
  324. const QVector<int> &roles = QVector<int> ());
  325. void rowsInserted(const QModelIndex &parent,
  326. int start, int end) ;
  327. void dataChanged (const QModelIndex &topLeft,
  328. const QModelIndex &bottomRight,
  329. const QVector<int> &roles = QVector<int> ());
  330.  
  331. signals:
  332. void change_data(const QModelIndex &topLeft,
  333. const QModelIndex &bottomRight,
  334. const QVector<int> &roles);
  335. void add_classeur(const QModelIndex &parent,
  336. int start, int end);
  337.  
  338. };
  339.  
  340.  
  341.  
  342. #endif // CLASSEURS_MODEL_H
  343. // here is my classeurs_model.cpp source file:
  344. #include "Classeurs/classeurs_treeview.h"
  345. #include "Classeurs/classeur.h"
  346.  
  347. Classeurs_Model::Classeurs_Model(Classeur *classeur):
  348. QAbstractItemModel(parent),
  349. m_classeur(classeur)
  350. {
  351.  
  352. }
  353.  
  354. Classeurs_Model::~Classeurs_Model()
  355. {
  356.  
  357. }
  358.  
  359.  
  360. int Classeurs_Model::columnCount(const QModelIndex &parent) const {
  361. return 4;
  362. }
  363.  
  364. int Classeurs_Model::rowCount(const QModelIndex &parent) const {
  365. if(!parent.isValid())
  366. return m_classeur->children().size();
  367. Classeur *classeur = reinterpret_cast<Classeur*>(parent.internalPointer());
  368. return classeur->children().size();
  369. }
  370.  
  371. int Classeurs_Model::totalRowCount(const QModelIndex &parent) const {
  372.  
  373. }
  374.  
  375. QVariant Classeurs_Model::data(const QModelIndex &index,
  376. int role) const {
  377. Classeur *classeur;
  378. if(!index.isValid())
  379. classeur = m_classeur;
  380. else
  381. classeur = reinterpret_cast<Classeur*>(parent.internalPointer());
  382. if(role == Qt::DisplayRole) {
  383. switch (index.column()) {
  384. case 0: {
  385. return classeur->Classeur_Info.name; break; }
  386. case 1: {
  387. return classeur->Classeur_Info.comment; break; }
  388. case 2: {
  389. return classeur->Classeur_Info.id; break; }
  390. case 2: {
  391. return classeur->Classeur_Info.id_parent; break; } }
  392. }
  393. }
  394.  
  395. QModelIndex Classeurs_Model::index(int row,
  396. int column,
  397. const QModelIndex &parent) const {
  398. Classeur *parentClasseur;
  399. if(!parent.isValid())
  400. return m_classeur;
  401. else
  402. parentClasseur = reinterpret_cast<Classeur*>(parent.internalPointer());
  403. Classeur *classeur = parentClasseur->children().at(row);
  404. return createIndex(row, column, classeur);
  405. }
  406.  
  407. QModelIndex Classeurs_Model::parent(const QModelIndex &child) const {
  408. if(!child.isValid())
  409. return QModelIndex();
  410. Classeur *classeur = reinterpret_cast<Classeur*>(child.internalPointer());
  411. Classeur *parentClasseur = classeur->parent();
  412. if(parentClasseur == m_classeur)
  413. return QModelIndex();
  414. int row = parentClasseur->parent()->children().indexOf(parentClasseur);
  415. return createIndex(row, 0, parentClasseur);
  416. }
  417.  
  418. Files_Model* Classeurs_Model::getCurrent_Files_model(QModelIndex &index) {
  419. if(!index.isValid())
  420. return Files_Model();
  421. Classeur *classeur = reinterpret_cast<Classeur*>(index.internalPointer());
  422. return classeur->Classeur_Info.files_model;
  423. }
  424.  
  425. Classeur* Classeurs_Model::getCurrentClasseur(QModelIndex &index) {
  426. if(!index.isValid())
  427. return Files_Model();
  428. Classeur *classeur = reinterpret_cast<Classeur*>(index.internalPointer());
  429. return classeur;
  430. }
  431.  
  432. void Classeurs_Model::rowsInserted(const QModelIndex &parent,
  433. int start, int end) {
  434. emit add_classeur(parent, start, end);
  435. }
  436.  
  437. void Classeurs_Model::dataChanged(const QModelIndex &topLeft,
  438. const QModelIndex &bottomRight,
  439. const QVector<int> &roles) {
  440. emit change_data(topLeft, bottomRight, roles);
  441. }
Advertisement
Add Comment
Please, Sign In to add comment