qtablewidget button setzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
chrimoe
User
Beiträge: 6
Registriert: Freitag 30. November 2018, 18:58

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?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte Code Tags benutzen. Der Code ist sonst so völlig unlesbar.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__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`.
“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
chrimoe
User
Beiträge: 6
Registriert: Freitag 30. November 2018, 18:58

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?
Fire Spike
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:
immer noch falsch, oder siehst du einrückungen?
chrimoe
User
Beiträge: 6
Registriert: Freitag 30. November 2018, 18:58

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)))
            
Benutzeravatar
__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.
“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
chrimoe
User
Beiträge: 6
Registriert: Freitag 30. November 2018, 18:58

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?
Benutzeravatar
__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?
“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
Antworten