Seite 1 von 1
qtablewidget button setzen
Verfasst: Freitag 1. November 2019, 18:24
von chrimoe
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?
Re: qtablewidget button setzen
Verfasst: Freitag 1. November 2019, 18:46
von __deets__
Bitte Code Tags benutzen. Der Code ist sonst so völlig unlesbar.
Re: qtablewidget button setzen
Verfasst: Freitag 1. November 2019, 18:49
von __deets__
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.
Re: qtablewidget button setzen
Verfasst: Freitag 1. November 2019, 18:52
von __blackjack__
@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`.
Re: qtablewidget button setzen
Verfasst: Freitag 1. November 2019, 19:49
von chrimoe
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?
Re: qtablewidget button setzen
Verfasst: Freitag 1. November 2019, 20:12
von Fire Spike
immer noch falsch, oder siehst du einrückungen?
Re: qtablewidget button setzen
Verfasst: Freitag 1. November 2019, 20:24
von chrimoe
im Editor sind meine Einrückungen noch vorhanden, dann nicht mehr?????
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)))
Re: qtablewidget button setzen
Verfasst: Freitag 1. November 2019, 21:46
von __blackjack__
@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.
Re: qtablewidget button setzen
Verfasst: Freitag 1. November 2019, 22:25
von chrimoe
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?
Re: qtablewidget button setzen
Verfasst: Freitag 1. November 2019, 23:32
von __blackjack__
@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?