Bonjour à tous,
Voila, j'ai une question plus théorique qu'autre chose. Je m'explique : je développe un logiciel de ticketing pour la gestion des contrats de maintenance et forcément la gestion de tickets incidents chez des clients. J'ai choisi le Framework Qt car il faut que cette application puisse fonctionner sur OS Mac et Windows. Tout la partie gestion client/site/salle et équipements assignés aux salles et aux contrats est faite (base de données et programme Qt sur les deux OS). Il me reste à faire la partie "ticketing", et pour cela je doit faire plus de manipulations dans les QtableView/QAbstractItemModel afin de faire remonter les informations importantes sans que l'utilisateur soit obligé de se farcir toute la liste de ticket pour voir les importants.
Donc pour faire cela, j'ai essayé d'approfondir le système modèl/vue de Qt. Je l'ai utilisé pour la première partie sans problème pour les sélections, récupérations de données et cacher des colonnes de la base de donnée qui n'ont pas à être vue par l'utilisateur par exemple. Et là, je suis tombé sur une question sans réponse :
Pour faire un classement tout bête par ordre alphabétique a partir d'une colonne donnée, si je me report à la doc Qt, je doit faire un code de ce style :
Ça ne donne pas d'erreur à la compilation, mais pas de classement par ordre alphabétique en résultat!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { resize(1000,800); table = new QTableView(this); table->move(50, 50); table->setFixedSize(900, 200); QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("LocalHost"); db.setUserName("root"); db.setPassword("MdP"); db.setDatabaseName("nomBase"); db.open(); QSqlQueryModel *modal = new QSqlQueryModel(); QSqlQuery *qry = new QSqlQuery(db); qry->prepare("SELECT * FROM listclient "); qry->exec(); modal->setQuery(*qry); table->setModel(modal); table->sortByColumn(1); table->setSortingEnabled(true); }
j'ai parcouru les forums, et j'ai beaucoup lu qu'il fallait passer par un QAbstractItemModel pour des fonctions plus poussées... retour à la doc Qt et en la suivant je vois qu'il faut faire un truc de ce style :
Même résultat...(même si j'utilise une deuxième QtableView à assigner à itemModel)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 ..../ db.open(); QSqlQueryModel *modal = new QSqlQueryModel(); QSqlQuery *qry = new QSqlQuery(db); qry->prepare("SELECT * FROM listclient "); qry->exec(); modal->setQuery(*qry); table->setModel(modal); QAbstractItemModel *itemModel; itemModel = table->model(); itemModel->sort(1); }
Sur une autre discussion d'un forum d'un autre problème, ils disaient à la fin d'aller voir du coté de QSortFilterProxyModel.... vue le nom, je me suis intéressé à coco...
et j'ai donc fait ça :
Et là.... ça marche.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 ..../ db.open(); QSqlQueryModel *modal = new QSqlQueryModel(); QSqlQuery *qry = new QSqlQuery(db); qry->prepare("SELECT * FROM listclient "); qry->exec(); modal->setQuery(*qry); QSortFilterProxyModel *proxiModel = new QSortFilterProxyModel(modal) ; proxiModel->setSourceModel(modal); proxiModel->sort(1); table->setModel(proxiModel); }
et pire, si je fait ça :
Ça marche aussi ... J'ai également le classement qui s'opère...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 ..../ db.open(); QSqlQueryModel *modal = new QSqlQueryModel(); QSqlQuery *qry = new QSqlQuery(db); qry->prepare("SELECT * FROM listclient "); qry->exec(); modal->setQuery(*qry); QSortFilterProxyModel *proxiModel = new QSortFilterProxyModel(modal) ; proxiModel->setSourceModel(modal); table->setModel(proxiModel); QAbstractItemModel *itemModel; itemModel = table->model(); itemModel->sort(1); }...Mais c'est pas logique, c'est QSortFilterProxyModel qui hérite de QAbstractItemModel via QAbstractProxyModel, et pas l'inverse ???
Donc, voila, je pense que j'ai loupé un truc....
Questions :
Pourquoi les deux premiers codes n'ont pas agit ?
Pourquoi le dernier code fonctionne ?
Y a t-il un moyen de voir tous les héritiers d'une classe sans devoir se les faire un par un ? (ça coûte rien de demander lol)
Je suis preneur de toute suggestion ou information.
Merci pour le temps passé![]()
Partager