Hallo zusammen;
Situationsbeschreibung:
Ein Tablewidget wird korrekt aus einer Datenbank befüllt, das Tablewidget ist 3 columns grösser als der angezeigte Datensatz:
col-index 0 bis 4 Datensatzelemente, col-index 5 bis 7 für Buttons
Problem: die Buttons werden nur beim letzten Datensatz in die columns 5, 6 und 7 gesetzt.
Code:
Buttons (in init-function, daher mit self.):
self.pB_change_item = QtWidgets.QPushButton("Editieren", self)
self.pB_deactivate_item = QtWidgets.QPushButton("Deaktivieren", self)
self.pB_delete_item = QtWidgets.QPushButton("Löschen", self)
Tabellenbefüllung (in showItems-function):
if records is not None:
for row_number, row_data in enumerate (records):
self.ui.tW_allitems.insertRow(row_number)
for column_number, data in enumerate (row_data):
self.ui.tW_allitems.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data)))
col = column_number + 2
self.ui.tW_allitems.setCellWidget(row_number, col, self.pB_change_item)
col = col + 1
self.ui.tW_allitems.setCellWidget(row_number, col, self.pB_deactivate_item)
col = col + 1
self.ui.tW_allitems.setCellWidget(row_number, col, self.pB_delete_item)
self.ui.tW_allitems.setItem(row_number, 4, QtWidgets.QTableWidgetItem(str(row_number) + ', ' + str(col)))
mithilfe der letzten hier zu sehenden Codezeile lasse ich mir zu Testzwecken in einer -noch freien- column die row und column anzeigen, row und column werden korrekt angezeigt! Beispiel: 0, 7; 1,7 ; ...
was mache ich mit den Buttons falsch?
qtablewidget button setzen
Und zu deiner Frage: so wie ich https://doc.qt.io/qt-5/qtablewidget.html#setCellWidget verstehe, muss das pro Zelle passieren. Einfach drei Widgets für alle reicht nicht.
- __blackjack__
- User
- Beiträge: 14005
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@chrimoe: Es gibt ja nur drei Buttons also werden auch nur drei angezeigt. Und zwar dort wo sie als letztes hingesetzt wurden, wenn man die unsinnigerweise mehrfach setzt. Wenn Du mehr Schaltflächen willst, dann musst Du mehr erzeugen. Wenn das drei pro Zeile sein sollen, dann eben auch drei pro Zeile.
Du solltest Dir schnell wieder diese komischen zweibuchstabigen Präfixe abgewöhnen. Wenn Du `push_button` oder `button` meinst, dann schreib nicht `pB`.
Du solltest Dir schnell wieder diese komischen zweibuchstabigen Präfixe abgewöhnen. Wenn Du `push_button` oder `button` meinst, dann schreib nicht `pB`.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
sorry für den "Plain"-Code
hier noch einmal in der real existierenden Struktur:
for row_number, row_data in enumerate (records):
self.ui.tW_allitems.insertRow(row_number)
for column_number, data in enumerate (row_data):
self.ui.tW_allitems.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data)))
col = column_number + 2
self.ui.tW_allitems.setCellWidget(row_number, col, self.pB_change_item)
col = col + 1
self.ui.tW_allitems.setCellWidget(row_number, col, self.pB_deactivate_item)
col = col + 1
self.ui.tW_allitems.setCellWidget(row_number, col, self.pB_delete_item)
self.ui.tW_allitems.setItem(row_number, 4, QtWidgets.QTableWidgetItem(str(row_number) + ', ' + str(col)))
Ich bin bisher immer davon ausgegangen, das alles was unter "for row_number, row_data in enumerate (records):" steht, pro Tabellenzeile ausgeführt wird!?
Ist dem nicht so?
hier noch einmal in der real existierenden Struktur:
for row_number, row_data in enumerate (records):
self.ui.tW_allitems.insertRow(row_number)
for column_number, data in enumerate (row_data):
self.ui.tW_allitems.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data)))
col = column_number + 2
self.ui.tW_allitems.setCellWidget(row_number, col, self.pB_change_item)
col = col + 1
self.ui.tW_allitems.setCellWidget(row_number, col, self.pB_deactivate_item)
col = col + 1
self.ui.tW_allitems.setCellWidget(row_number, col, self.pB_delete_item)
self.ui.tW_allitems.setItem(row_number, 4, QtWidgets.QTableWidgetItem(str(row_number) + ', ' + str(col)))
Ich bin bisher immer davon ausgegangen, das alles was unter "for row_number, row_data in enumerate (records):" steht, pro Tabellenzeile ausgeführt wird!?
Ist dem nicht so?
-
- User
- Beiträge: 329
- Registriert: Montag 13. Mai 2019, 16:05
- Wohnort: Erde
Code: Alles auswählen
hier noch einmal in der real existierenden Struktur:
im Editor sind meine Einrückungen noch vorhanden, dann nicht mehr?????
Also noch einmal
Also noch einmal
Code: Alles auswählen
for row_number, row_data in enumerate (records):
self.ui.tW_allitems.insertRow(row_number)
for column_number, data in enumerate (row_data):
self.ui.tW_allitems.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(str(data)))
col = column_number + 2
self.ui.tW_allitems.setCellWidget(row_number, col, self.pB_change_item)
col = col + 1
self.ui.tW_allitems.setCellWidget(row_number, col, self.pB_deactivate_item)
col = col + 1
self.ui.tW_allitems.setCellWidget(row_number, col, self.pB_delete_item)
self.ui.tW_allitems.setItem(row_number, 4, QtWidgets.QTableWidgetItem(str(row_number) + ', ' + str(col)))
- __blackjack__
- User
- Beiträge: 14005
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@chrimoe: Ja der Code in der Schleife wird pro Datensatz ausgeführt. Und da werden immer wieder die *selben* drei Buttons gesetzt die *vor* dieser Schleife erstellt wurden. *Ein und der selbe* Button kann aber immer nur *einmal* in der GUI angezeigt werden. Also werden die drei an der Stelle angezeigt an die sie zuletzt gesetzt wurden, also im letzten Schleifendurchlauf in die letzte Tabellenzeile.
Selbst wenn Qt den *selben* Button mehr als einmal anzeigen *könnte*, wäre das auch hier ziemlich witzlos, denn ich vermute ja mal ganz stark die Aktion dahinter sollte sich dann auf den Datensatz in der Tabellenzeile beziehen, das geht aber nicht wenn alle Zeilen den *selben* Button verwenden würden, denn irgendwo muss ja die Information herkommen/an den jeweiligen Button gebunden werden, in welcher Zeile er sich befindet, beziehungsweise auf welchen Datensatz er sich bezieht.
Selbst wenn Qt den *selben* Button mehr als einmal anzeigen *könnte*, wäre das auch hier ziemlich witzlos, denn ich vermute ja mal ganz stark die Aktion dahinter sollte sich dann auf den Datensatz in der Tabellenzeile beziehen, das geht aber nicht wenn alle Zeilen den *selben* Button verwenden würden, denn irgendwo muss ja die Information herkommen/an den jeweiligen Button gebunden werden, in welcher Zeile er sich befindet, beziehungsweise auf welchen Datensatz er sich bezieht.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
hallo blackjack,
danke für Deinen Hinweis.
Die Information auf welchen Datensatz sich die Buttonaktion bezieht, würde ich über den Zellenindex lösen. Heißt wenn ich den Button in der Zelle 0,5 betätige, wäre es das Editieren des Datensatzes mit dem row-index 0, der selbe Button in der Zelle 1,5 äquivalent für den Datensatz mit dem row-Index 1, usw.
Wie sähe dann eine alternative Lösung aus, bei der je Tabellenzeile jeweils 3 Buttons "Editieren", "Deaktivieren", "Löschen" adäquate Funktionen auf die jeweilige Tabellenzeile auslösen?
danke für Deinen Hinweis.
Die Information auf welchen Datensatz sich die Buttonaktion bezieht, würde ich über den Zellenindex lösen. Heißt wenn ich den Button in der Zelle 0,5 betätige, wäre es das Editieren des Datensatzes mit dem row-index 0, der selbe Button in der Zelle 1,5 äquivalent für den Datensatz mit dem row-Index 1, usw.
Wie sähe dann eine alternative Lösung aus, bei der je Tabellenzeile jeweils 3 Buttons "Editieren", "Deaktivieren", "Löschen" adäquate Funktionen auf die jeweilige Tabellenzeile auslösen?
- __blackjack__
- User
- Beiträge: 14005
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@chrimoe: Na eben nicht die selben drei Buttons in jeder Zeile zu setzen, was ja nicht funktioniert, sondern immer für jede Zeile drei neue Buttons erstellen. Und an die Information auf welchen Datensatz sich der jeweilige Button bezieht, musst Du da ja auch festlegen wenn Du die nötigen Informationen dazu hast.
Wobei ich drei Buttons pro Datensatz recht verschwenderisch finde. Warum nicht nur drei Buttons die sich dann auf den, oder gar *die*, ausgewählte(n) Zeile(n) beziehen?
Wobei ich drei Buttons pro Datensatz recht verschwenderisch finde. Warum nicht nur drei Buttons die sich dann auf den, oder gar *die*, ausgewählte(n) Zeile(n) beziehen?
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis