J'ai créer un QtreeWidget pour afficher les données d'une base de données. Je récupère bien toutes mes données dans une liste qui contient d'autres listes.
La liste à lire est de ce type, dans l'exemple il y aura donc 3 lignes a ajouter dans le QtreeWidget, mais en réalité ce nombre doit etre variable. Par contre le nombre de colonne est toujours fixe. (Colonne 1, Colonne 2, Colonne 3)
Est-ce que quelqu'un a une idée de comment faire cela ?
J'ai créer un QtreeWidget pour afficher les données d'une base de données. Je récupère bien toutes mes données dans une liste qui contient d'autres listes.
Eh bien, vous devez savoir comment sont nommés chaque élément que vous ajouterez dans votre QTreeWidget ?
Il suffit de créer chaque élément de votre QTreeWidget, de les ajouter à l'aide de la bonne méthode indiquée dans la documentation Qt à partir d'une boucle.
Si vous utilisez Qt, c'est que vous maîtrisez le langage Python ! Pas besoin d'avoir un code exemple...
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
J'ai créer un QtreeWidget pour afficher les données d'une base de données. Je récupère bien toutes mes données dans une liste qui contient d'autres listes.
Eh bien, vous devez savoir comment sont nommés chaque élément que vous ajouterez dans votre QTreeWidget ?
Il suffit de créer chaque élément de votre QTreeWidget, de les ajouter à l'aide de la bonne méthode indiquée dans la documentation Qt à partir d'une boucle.
Si vous utilisez Qt, c'est que vous maîtrisez le langage Python ! Pas besoin d'avoir un code exemple...
Non je ne maitrise ni python ni qt, je travaille avec python depuis quelques moi seulement. Je n'ai pas trouvé la méthode a utiliser dans la doc qt d ou ma venue ici
Si vous ne maîtrisez pas python, il vous sera difficile de comprendre une documentation Qt plus touffue utilisant très généralement la programmation orientée objets.
Commencez par créer un petit code fonctionnel avec votre liste de mots et un QTreeWidget vide...
Après on pourra toujours y ajouter un complément pour vous aider.
- Edité par fred1599 30 janvier 2024 à 19:09:47
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Je me demande si le QTreeWidget est le mieux pour présenter des données, peut-être mieux un QTableView ou QTableWidget
C'est fort possible ! Mais le PO le verra sans doute lors de son test
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
En fait j'avais commencé mon logiciel avec un QTableWidget et ca fonctionne, j'arrive a afficher toutes les données de ma bdd.
Le soucis est que chaque cellule est éditable et je ne veux pas que ce soit éditable, et autre chose qui me plait pas avec le QTableWidget c'est que quand on clique sur une cellule ca ne sélectionne que la cellule, moi je voudrais que ca sélectionne la ligne entière.
Ici mon tableWidget fonctionne mais je veux eviter de pouvoir selectionner une seule cellule a la fois et surtout que ce soit pas éditable, juste de la lecture.
J'ai essayé de faire un :
tableWidget.setEnabled(True)
Alors effectivement ca désactive la modification des cellules mais ca desactive aussi les scrollbar du bas et de droite, donc ca ne va pas...
Y'a peut etre d'autres méthodes ?
Pour remplir mon tableWidget je fais comme cela :
ui.tableWidget.setRowCount(0)
for row_number, row_data in enumerate(result):
tableWidget.insertRow(row_number)
for column_number, data in enumerate (row_data):
tableWidget.setItem(row_number, column_number, QTableWidgetItem(str(data)))
EDIT:
J'ai essayé de rajouter un flag pour bloquer l'édition des cellules mais ca ne fonctionne pas, mes cellules ne sont meme plus remplies avec les données.
Merci de ta réponse mais ca ne fonctionne pas, j'ai toujours le meme probléme que précédemment, a savoir les 2 lignes se creer dans le QTableWidget mais elles restent vide quand j'ajoute le .setFlags.
Alors que quand je ne met pas le .setFlages les lignes se remplissent bien...
conn = sqlite3.connect(self.path_bdd)
curseur = conn.cursor()
result = curseur.execute(f"SELECT * FROM {table}")
ui.tableWidget.setRowCount(0)
for row_number, row_data in enumerate(result):
ui.tableWidget.insertRow(row_number)
for column_number, data in enumerate (row_data):
ui.tableWidget.setItem(row_number, column_number, QTableWidgetItem(str(data)).setFlags(PySide6.QtCore.Qt.ItemIsEditable))
En fait je voyais plutot comme ceci (sans avoir testé):
for row_number, row_data in enumerate(result):
ui.tableWidget.insertRow(row_number)
for column_number, data in enumerate (row_data):
item = QTableWidgetItem()
item.setText(str(data))
item.setFlags(PySide6.QtCore.Qt.ItemIsEditable)
ui.tableWidget.setItem(row_number, column_number, item)
autre chose qui me plait pas avec le QTableWidget c'est que quand on clique sur une cellule ca ne sélectionne que la cellule, moi je voudrais que ca sélectionne la ligne entière
C'est le fonctionnement standard d'un tableur ! Pour sélectionner toute la ligne, vous pouvez garder le clic sur la cellule et sélectionner de gauche à droite les autres cellules.
Si maintenant vous retirez la sélection standard d'une cellule, et que pour je ne sais quelle raison, vous souhaitez avoir à nouveau ce mode de fonctionnement, vous risquez de casser tout votre code. Réfléchissez peut-être à un autre moyen de sélectionner toute une ligne ? D'ailleurs que se passe-t-il si je clique sur un numéro de ligne dans votre QTableWidget ?
Alors effectivement ca désactive la modification des cellules mais ca desactive aussi les scrollbar du bas et de droite, donc ca ne va pas...
Je ne vois pas trop le rapport entre une cellule éditable ou non, et les scrollbar, pouvez-vous écrire un code (voir deux codes) avec le cas où les cellules sont éditables et le cas où les cellules sont pas éditables afin de voir apparaître l'état des scrollbars ?
Je vous avais demandé un code testable, ce qui veut dire que quand je copie colle votre code dans mon IDE, ça s'exécute correctement... vous ne l'avez pas fait ! Difficile d'attendre par la suite, une réponse correcte, sachant que de notre côté nous ne pouvons pas testé... n'attendez pas non plus qu'on écrive des petits codes testables pour vérifier que ce que vous dîtes est vrai, à vous de le prouver.
Merci de ta réponse mais ca ne fonctionne pas, j'ai toujours le meme probléme que précédemment, a savoir les 2 lignes se creer dans le QTableWidget mais elles restent vide quand j'ajoute le .setFlags.
on peut voir le code testable et faire des tests de notre côté ?
EDIT : J'avais un peu de temps, j'ai testé QTableWidget et cette histoire de scrollbar quand on rend les cellules non éditables.
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
from PyQt6.QtCore import Qt
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.data = [["aaaa", "bbbb", "cccc"], ["dddd", "eeee", "ffff"], ["gggg", "hhhh", "iiii"]]
self.table = QTableWidget()
self.table.setRowCount(len(self.data))
self.table.setColumnCount(len(self.data[0]))
for i, row in enumerate(self.data):
for j, val in enumerate(row):
item = QTableWidgetItem(val)
# Rendre l'élément non éditable
item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
self.table.setItem(i, j, item)
self.layout = QVBoxLayout()
self.layout.addWidget(self.table)
self.central_widget = QWidget()
self.central_widget.setLayout(self.layout)
self.setCentralWidget(self.central_widget)
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('Tableau PyQt')
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec())
de mon côté je ne vois pas de différence sur l'état du scrollbar lorsque les cellules sont soit éditables soit non éditabes.
du coup je ne vois pas le problème !
P.S J'ai cliqué sur la cellule numérotée d'une ligne, et l'ensemble des colonnes de la ligne sont bien sélectionnées.
Je ne comprend pas la demande de cliquer sur une cellule pour sélectionner l'ensemble de la ligne...
Clic sur un numéro de ligne
- Edité par fred1599 31 janvier 2024 à 19:05:40
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
autre chose qui me plait pas avec le QTableWidget c'est que quand on clique sur une cellule ca ne sélectionne que la cellule, moi je voudrais que ca sélectionne la ligne entière
C'est le fonctionnement standard d'un tableur ! Pour sélectionner toute la ligne, vous pouvez garder le clic sur la cellule et sélectionner de gauche à droite les autres cellules.
Si maintenant vous retirez la sélection standard d'une cellule, et que pour je ne sais quelle raison, vous souhaitez avoir à nouveau ce mode de fonctionnement, vous risquez de casser tout votre code. Réfléchissez peut-être à un autre moyen de sélectionner toute une ligne ? D'ailleurs que se passe-t-il si je clique sur un numéro de ligne dans votre QTableWidget ?
Alors effectivement ca désactive la modification des cellules mais ca desactive aussi les scrollbar du bas et de droite, donc ca ne va pas...
Je ne vois pas trop le rapport entre une cellule éditable ou non, et les scrollbar, pouvez-vous écrire un code (voir deux codes) avec le cas où les cellules sont éditables et le cas où les cellules sont pas éditables afin de voir apparaître l'état des scrollbars ?
Je vous avais demandé un code testable, ce qui veut dire que quand je copie colle votre code dans mon IDE, ça s'exécute correctement... vous ne l'avez pas fait ! Difficile d'attendre par la suite, une réponse correcte, sachant que de notre côté nous ne pouvons pas testé... n'attendez pas non plus qu'on écrive des petits codes testables pour vérifier que ce que vous dîtes est vrai, à vous de le prouver.
Merci de ta réponse mais ca ne fonctionne pas, j'ai toujours le meme probléme que précédemment, a savoir les 2 lignes se creer dans le QTableWidget mais elles restent vide quand j'ajoute le .setFlags.
on peut voir le code testable et faire des tests de notre côté ?
EDIT : J'avais un peu de temps, j'ai testé QTableWidget et cette histoire de scrollbar quand on rend les cellules non éditables.
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
from PyQt6.QtCore import Qt
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.data = [["aaaa", "bbbb", "cccc"], ["dddd", "eeee", "ffff"], ["gggg", "hhhh", "iiii"]]
self.table = QTableWidget()
self.table.setRowCount(len(self.data))
self.table.setColumnCount(len(self.data[0]))
for i, row in enumerate(self.data):
for j, val in enumerate(row):
item = QTableWidgetItem(val)
# Rendre l'élément non éditable
item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
self.table.setItem(i, j, item)
self.layout = QVBoxLayout()
self.layout.addWidget(self.table)
self.central_widget = QWidget()
self.central_widget.setLayout(self.layout)
self.setCentralWidget(self.central_widget)
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('Tableau PyQt')
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec())
de mon côté je ne vois pas de différence sur l'état du scrollbar lorsque les cellules sont soit éditables soit non éditabes.
du coup je ne vois pas le problème !
P.S J'ai cliqué sur la cellule numérotée d'une ligne, et l'ensemble des colonnes de la ligne sont bien sélectionnées.
Je ne comprend pas la demande de cliquer sur une cellule pour sélectionner l'ensemble de la ligne...
Clic sur un numéro de ligne
- Edité par fred1599 il y a environ 15 heures
Bonjour,
Quand j'essaye d'integrer l'exemple de code que tu ma fourni et t'en remercie j'ai une erreur à la ligne 14:
def remplir_tableView_scene_visualiser_equipements(self, path_bdd, table, ui):
conn = sqlite3.connect(self.path_bdd)
curseur = conn.cursor()
result = curseur.execute(f"SELECT * FROM {table}")
data = result.fetchall()
ui.tableWidget_visualiser_equipements.setRowCount(len(data))
ui.tableWidget_visualiser_equipements.setColumnCount(len(data[0]))
for i, row in enumerate(data):
for j, val in enumerate(row):
item = QTableWidgetItem(val)
# Rendre l'élément non éditable
item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
ui.tableWidget_visualiser_equipements.setItem(i, j, item)
Pour la désactivation des scrollbars ca me donnait ca :
Je ne pouvais plus accéder aux scrollbars ni même cliquer sur aucune cellule, mais en cherchant de plus près j'ai vu que c'était parce que j'avais appliqué le setEnabled(False) au tableWidget en général et pas uniquement aux cellules qui le compose.
Garkam a écrit:
En fait je voyais plutot comme ceci (sans avoir testé):
for row_number, row_data in enumerate(result):
ui.tableWidget.insertRow(row_number)
for column_number, data in enumerate (row_data):
item = QTableWidgetItem()
item.setText(str(data))
item.setFlags(PySide6.QtCore.Qt.ItemIsEditable)
ui.tableWidget.setItem(row_number, column_number, item)
- Edité par Garkam hier à 1:52
Merci de ton aide ca fonctionne aussi effectivement de cette maniere
Encore une fois votre code n'est pas testable en l'état, le mien fonctionne si vous utilisez PyQt6...
EDIT : Si vous utilisez PyQt5, modifiez item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable) par item.setFlags(item.flags() & ~Qt.ItemIsEditable)
- Edité par fred1599 1 février 2024 à 10:55:11
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
C'est compliqué de vous faire un code qui s'exécute en reprenant mon code, tout est dans des fichiers séparés et il y a près de 10 000lignes de code pour le moment, c'est pour cela que je donne juste la fonction en question. Et de plus l'interface graphique a été faite avec QtDesigner.
Quand j'intègre ma base de données dans ton programme ca fonctionne bien:
import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
from PyQt6.QtCore import Qt
import sqlite3
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
table = "main"
conn = sqlite3.connect(r"C:\Users\********.db")
curseur = conn.cursor()
result = curseur.execute(f"SELECT * FROM {table}")
self.data = result.fetchall()
self.table = QTableWidget()
self.table.setRowCount(len(self.data))
self.table.setColumnCount(len(self.data[0]))
for i, row in enumerate(self.data):
for j, val in enumerate(row):
item = QTableWidgetItem(val)
# Rendre l'élément non éditable
item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
self.table.setItem(i, j, item)
self.layout = QVBoxLayout()
self.layout.addWidget(self.table)
self.central_widget = QWidget()
self.central_widget.setLayout(self.layout)
self.setCentralWidget(self.central_widget)
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('Tableau PyQt')
if __name__ == '__main__':
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec())
Mais quand j'intègre dans mon code source ca ne fonctionne plus, ca met met bien toutes les lignes, mais elles sont vides et toujours editables:
def remplir_tableView(self, path_bdd, table, ui):
table = "main"
conn = sqlite3.connect(r"C:\Users\*****.db")
curseur = conn.cursor()
result = curseur.execute(f"SELECT * FROM {table}")
self.data = result.fetchall()
self.table = ui.tableWidget
self.table.setRowCount(len(self.data))
self.table.setColumnCount(len(self.data[0]))
for i, row in enumerate(self.data):
for j, val in enumerate(row):
item = QTableWidgetItem(val)
# Rendre l'élément non éditable
item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
self.table.setItem(i, j, item)
Quand je commente la ligne 17 le tableau est bien rempli et ca fonctionne (avec cellules éditables bien sûr.)
à mon avis l'erreur est là : self.table = ui.tableWidget_visualiser_equipements faîtes un print(self.table) et un print(self.data) pour vérifier que vous recevez bien les résultats attendus.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
J'ai essayé de décomposer et ca fait le meme résultat, par contre si je commente la ligne 2 la tableau se rempli.
fred1599 a écrit:
à mon avis l'erreur est là : self.table = ui.tableWidget_visualiser_equipements faîtes un print(self.table) et un print(self.data) pour vérifier que vous recevez bien les résultats attendus.
J'ai enleve les données de ma base de données pour essayer avec juste une liste qui contient 3 autres listes et ca fait toujours le meme resultat. Sans la fameuse ligne le tableWidget se rempli, et avec la ligne il ne se rempli plus et me renvoie une erreur comme ci dessous.
def remplir_tableView_scene_visualiser_equipements(self, path_bdd, table, ui):
self.data = [["aaaa", "bbbb", "cccc"], ["dddd", "eeee", "ffff"], ["gggg", "hhhh", "iiii"]]
self.table = ui.tableWidget_visualiser_equipements
self.table.setRowCount(len(self.data))
self.table.setColumnCount(len(self.data[0]))
for i, row in enumerate(self.data):
for j, val in enumerate(row):
item = QTableWidgetItem(val)
# Rendre l'élément non éditable
# item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
self.table.setItem(i, j, item)
print(f"self.table: {self.table}")
print(f"self.data: {self.data}")
Chez moi ça fonctionne, et comme je peux pas reproduire, soit vous créer un code permettant de tester et reproduire chez moi, soit je ne peux pas vous aider
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Etonnant que l'exemple que donne @fred1599 ici fonctionne et qu'une fois les éléments insérés dans ton script, ça ne marche plus !!!
C'est que le problème est ailleurs...
Oui et j'en suis certains, cependant on ne sait pas ce qui se passe après dans son code, donc aucune reproduction possible pour vérifier cette erreur.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Bah utilise déjà PySide6 à la place de PyQt6 dans ton code
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Oui je ne comprend pas non plus, rien que par rapport à la boucle événementielle, mais comme ce ne sont que des Enums, ça devait passer.
- Edité par fred1599 1 février 2024 à 23:44:02
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Ajouter des données dans un QTreeWidget
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)