QTableWidget mit Integer füllen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Tanrim
User
Beiträge: 14
Registriert: Montag 11. März 2024, 12:20

Hallo zusammen!

Ich bin ziemlicher Python- (und mehr oder weniger auch Programmier) Frischling.

In meinem Projekt nutze ich Pyside6 und QTDesigner

Ich möchte ein QtableWidget mit Integer füllen, um diese mit der Sortier-Funktion der Tabelle anschließend auch sortieren zu können (als String bekomme ich "1,10,2" statt "1,2,10").

Könnt ihr mir da weiterhelfen?

Code: Alles auswählen

self.table_Kundendaten.setItem(row_number, column_number, qtw.QTableWidgetItem(str(data)))

Ich habe eine mögliche für mich etwas umständliche Lösung gefunden, die bei mir aber (noch) nicht funktioniert:

Code: Alles auswählen

if isinstance(data,str):

	self.table_Kundendaten.setItem(row_number, column_number, qtw.QTableWidgetItem(str(data)))
	
elif isinstance(data,int):

	tempItem = qtw.QTableWidgetItem()
	tempItem.setData(qtc.Qt.EditRole, QtCore.QVariant(data))
	self.table_Kundendaten.setItem(row_number, column_number, tempItem)
print(type(temp)) >>> "<PySide6.QtWidgets.QTableWidgetItem object at 0x000001ED34429200>"

Mit diesem Code werden die Integer aber nicht in der Tabelle angezeigt. Außerdem würde ich eine einfachere/andere Lösung bevorzugen, weil "QVariant" in Pyside nicht mehr unterstützt wird.


Hab stundenlang nach einer Lösung gesucht und weiß jetzt nicht mehr weiter.
Würde mich sehr über Hilfe freuen!

Martin
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist zu wenig Kontext, und es wirkt eher cargo-cultig. Die Daten nur fuer die EditRole zu setzen bedeutet, dass sie nicht angezeigt werden. Ich wuerde das alles entfernen, inklusive des ueberfluessigen str(data), denn das data str ist, hast du ja vorher geprueft. Und einfach direkt deine Daten setzen.

Was stattdessen passieren muss: deine Daten muessen schon die richtigen Typen haben. Denn Qt kann ja verschiedene Typen unterscheiden. Da vermute ich den Fehler, zeig doch mal, wie die aussehen.
Tanrim
User
Beiträge: 14
Registriert: Montag 11. März 2024, 12:20

Hey, Danke für deine Antwort!

Die übergebenen Variablen sind string und integer (überprüft mit type).
Ohne str(data) werden die Integer nicht angezeigt.

self.table_Kundendaten.setItem(0, 0, qtw.QTableWidgetItem(12345)) >>> Leere Zelle
self.table_Kundendaten.setItem(0, 0, qtw.QTableWidgetItem("12345")) >>> 12345

Mein Stand ist, dass man nicht "einfach so" Integer in die Tabelle schreiben kann und alle Tutorials, die ich gefunden habe, wandeln ihre Integer vorher in Strings um.
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ok ich habe mich da nicht mehr genau genug erinnert, QTableWidget ist wohl eine runtergedummte Variante von dem, was ich immer benutzt habe. Naemlich QTableView. Dafuer habe ich mal gerade ein kleines Beispielprogramm gebaut, das tut fuer mich.

Code: Alles auswählen

import sys
from PyQt5.QtCore import (
    QAbstractTableModel,
    QVariant,
    QSortFilterProxyModel,
    Qt,
    )
from PyQt5.QtWidgets import (
    QTableView,
    QApplication,
    )


TEST_DATA = [
    ("Hallo", 1234),
    ("Peter", 23),
    ("Pillepalle", 13430),
]


class Model(QAbstractTableModel):

    def __init__(self, data, *a, **kw):
        super().__init__(*a, **kw)
        self._data = data

    def rowCount(self, index):
        return len(self._data)

    def columnCount(self, index):
        return 2

    def data(self, index, role):
        if index.isValid() and role == Qt.DisplayRole:
            row, column = index.row(), index.column()
            print(row, column)
            try:
                return QVariant(self._data[row][column])
            except IndexError:
                pass

        return QVariant()


def main():
    app = QApplication(sys.argv)
    view = QTableView()
    model = Model(TEST_DATA)
    sortable_model = QSortFilterProxyModel()
    sortable_model.setSourceModel(model)
    view.setModel(sortable_model)
    view.setSortingEnabled(True)
    view.show()
    app.exec_()


# main guard
if __name__ == '__main__':
    main()
Tanrim
User
Beiträge: 14
Registriert: Montag 11. März 2024, 12:20

Oh, wow, vielen Dank!

Ich werde mal versuchen, das umzusetzen und berichten ob es geklappt hat!
Tanrim
User
Beiträge: 14
Registriert: Montag 11. März 2024, 12:20

Ich bekomme den Code zum Laufen, habe aber Schwierigkeiten, ihn in meine Anwendung zu integrieren.

Ich habe bei meiner Recherche Folgendes gefunden:
you can use Python's native types anywhere they would be needed in C++/Qt.

More details about this can be found in PSEP 101.

For example,

QString → str (unicode in Python 2)
QVariant → whatever type
QByteArray → bytes or bytearray

https://stackoverflow.com/questions/116 ... side-1-1-0
PySide6 Dokumentation

QVariant

As QVariant was removed, any function expecting it can receive any Python object (None is an invalid QVariant). The same rule is valid when returning something: the returned QVariant will be converted to its original Python object type.

When a method expects a QVariant::Type the programmer can use a string (the type name) or the type itself.

https://doc.qt.io/qtforpython-6/conside ... l#qvariant

Lässt sich damit QVariant im Code oben so anpassen, dass er nur mit PySide6 läuft?
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tanrim: Na einfach das `QVariant` weglassen wenn es mit Argument aufgerufen wird und aus einem QVariant-Aufruf ohne Argument wird `None`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Tanrim
User
Beiträge: 14
Registriert: Montag 11. März 2024, 12:20

Funktioniert hat es schließlich so:

Code: Alles auswählen

item = QtWidgets.QTableWidgetItem()
item.setData(QtCore.Qt.EditRole, data)
self.tableZutatArchiv.setItem(row_number, column_number, item)
Danke für die Unterstützung!
Antworten