QTableWidget Selektierte Zeilen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Peter1977
User
Beiträge: 90
Registriert: Mittwoch 4. September 2013, 14:59

Hallo,

Habe ein QTableWidget es sollen 1 bis mehrere Zeilen sektiert werden und diese dann weitergegeben werden.

Bis jetzt habe ich nur

Code: Alles auswählen

rows=[]
for idx in self.tbl_katalog.selectedIndexes():
    rows.append(idx.row())
eine Ausgabe von "rows.append(idx.row())" ergibt "None" in der Anzahl der vorhandenen Spalten
eine Ausgabe von "idx" ergibt "<PyQt4.QtCore.QModelIndex object at 0x0359CAF0>"

Wie komme ich jetzt auf den Eintrag der ersten Spalte?

Peter
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

``list.append`` gibt immer None zurück. Du musst dir schon das Ergebnis von ``idx.row()`` ausgeben lassen.
Das Leben ist wie ein Tennisball.
BlackJack

@Peter1977: Wenn es Dir nur um die Zeilen geht, wäre `selectedRows()` dann nicht die passendere Wahl?
Peter1977
User
Beiträge: 90
Registriert: Mittwoch 4. September 2013, 14:59

@BlackJack:
'selctedRows()' ist die passende Wahl habe es schon gefunden und getestet

Code: Alles auswählen

        indexes = self.tbl_bestellungen.selectionModel().selectedRows(0) # Es wird jede 1Spalte jeder Selektierten Zeile in die Variable indexes geschrieben
        if len(indexes)>0: # Geprüft ob indexes größer 0 ist
            Eintraege=""
            for index in indexes:
                item=self.tbl_bestellungen.itemFromIndex(index)
                if len(Eintraege)==0:
                    Eintraege=str(item.text()) 
                else:
                    Eintraege = Eintraege + "," + str(item.text())

# Es wird unter Variable Einträge die Werte der ersten spalte gespeichert einer jeden Selektierten Zeile getrennt durch ','
Peter
BlackJack

@Peter1977: Ein paar Anmerkungen zu dem Quelltext:

Mit den langen Kommentaren wird die empfohlene Zeilenlänge gesprengt. Inline-Kommentare, also solche am Ende von Code-Zeilen sollte man deshalb nur für sehr kurze Anmerkungen nutzen und ansonsten über den Code schreiben der Kommentiert werden soll. Und dort dann zur leichteren Lesbarkeit mehrere Zeilen schreiben wenn es zu lang wird.

Kommentare sollten dem Leser einen Zusatzwert zum Code liefern der damit kommentiert wird. Bei ``if len(indexes)>0:`` daneben zu schreiben ``# Geprüft ob indexes größer 0 ist`` trifft das nicht wirklich zu. Da wird einfach noch mal wiederholt was man im Code trivial ablesen kann.

Warum prüfst Du das überhaupt? Wenn die Länge 0 ist, dann wird die ``for``-Schleife auch nicht durchlaufen, dafür wäre aber `Eintraege` in jedem Fall definiert.

Vom `item` wird an *zwei* verschiedenen Stellen im Code der Text abgefragt und mit `str()` umgewandelt, der Programmfluss kommt aber garantiert an einer von beiden vorbei — man könnte das also an *einer* Stelle vorher machen.

Bedingungen wie ``if len(sequence) == 0:`` oder ``if len(sequence) != 0:`` schreibt man in Python in der Regel kürzer weil Containerobjekte in diesem Kontext als ”falsch” angesehen werden wenn sie leer sind, und als ”wahr” wenn mindestens ein Element darin enthalten ist. Also ``if not sequence:`` oder ``if sequence:``. Damit wären wir ungefähr bei so etwas:

Code: Alles auswählen

        #
        # Es wird jede 1. Spalte jeder selektierten Zeile in die Variable
        # `indexes` geschrieben.
        #
        indexes = self.tbl_bestellungen.selectionModel().selectedRows(0)
        entries = ''
        for index in indexes:
            text = str(self.tbl_bestellungen.itemFromIndex(index).text())
            if not entries:
                entries = text
            else:
                entries = entries + ',' + text
Hier ist jetzt noch das erstellen von `entries` total „unpythonisch” und auch ineffizient. Wenn man Zeichenketten in einer Schleife immer wieder mit ``+`` erweitert, muss man damit rechnen, dass die alten Daten jedes mal kopiert werden weil Zeichenketten in Python ja unveränderbar sind. Und da die Zeichenkette in jedem Durchlauf länger wird, müssen immer mehr Daten kopiert werden. Idiomatisch sammelt man die Einzelteile in einer Liste oder schreibt einen Generatorausdruck und setzt das Ergebnis dann mit der `join()`-Methode zusammen, wodurch man den gesamten Code bequem in vier Zeilen Code unterbringen kann:

Code: Alles auswählen

        entries = ','.join(
            str(self.tbl_bestellungen.itemFromIndex(index).text())
            for index in self.tbl_bestellungen.selectionModel().selectedRows(0)
        )
Peter1977
User
Beiträge: 90
Registriert: Mittwoch 4. September 2013, 14:59

Warum prüfst Du das überhaupt? Wenn die Länge 0 ist, dann wird die ``for``-Schleife auch nicht durchlaufen, dafür wäre aber `Eintraege` in jedem Fall definiert.
am ende nach der Auslesung und Weiterverarbeitung zu einem PDF Dokument kommt noch ein 'ELSE' falls keine selektiert worden sind mit einer Info Box.

Das mit dem Code nicht unbedingt den Vorgaben entspricht das ist richtig. Komme aber auch aus einer Anderen richtung der Programmierung normal schreibe ich NC-Programme
so wie das hier:

Code: Alles auswählen

0  BEGIN PGM WKZ_WECHSEL MM 
1  FN 26: TABOPEN TNC:\DATEIEN\TABELLEN\KONFIGURATION.TAB
2  FN 28: TABREAD Q1708 =53 /"WERT"
3  FN 28: TABREAD Q1707 =55 /"WERT"
4  FN 28: TABREAD Q1709 =58 /"WERT"
5  FN 18: SYSREAD Q1702 = ID20 NR1
6  FN 9: IF +Q1702 EQU +Q1700 GOTO LBL "WKZ_RICHTIG"
7  FN 18: SYSREAD Q1703 = ID2000 NR20 IDX151
8  FN 10: IF +Q1703 NE +1 GOTO LBL "KEIN_KOPF"
9  FN 18: SYSREAD Q1704 = ID2000 NR80 IDX2144
10 FN 9: IF +Q1704 EQU +0 GOTO LBL "IST_0"
11 Q1704 = Q1704 / 10
12 LBL "IST_0"
13 FN 9: IF +Q1704 EQU +0 GOTO LBL "GRAD_0"
14 FN 9: IF +Q1704 EQU +90 GOTO LBL "GRAD_90"
15 FN 9: IF +Q1704 EQU +180 GOTO LBL "GRAD_180"
16 FN 9: IF +Q1704 EQU +270 GOTO LBL "GRAD_270"
17 FN 9: IF +0 EQU +0 GOTO LBL "ENDE"
18 LBL "GRAD_0"
19 FN 28: TABREAD Q1705 =51 /"WERT"
20 FN 28: TABREAD Q1706 =52 /"WERT"
21 L  Y+Q1706 R0 FMAX M91
22 L  Z+Q1707 R0 FMAX M91
23 L  X+Q1705 R0 FMAX M91
24 FN 9: IF +0 EQU +0 GOTO LBL "SCHWENKEN"
25 LBL "GRAD_90"
26 FN 28: TABREAD Q1705 =51 /"WERT"
27 L  X+Q1705 R0 FMAX M91
28 L  Z+Q1707 R0 FMAX M91
29 FN 9: IF +0 EQU +0 GOTO LBL "SCHWENKEN"
30 LBL "GRAD_180"
31 FN 28: TABREAD Q1705 =51 /"WERT"
32 FN 28: TABREAD Q1706 =54 /"WERT"
33 L  Y+Q1706 R0 FMAX M91
34 L  Z+Q1707 R0 FMAX M91
35 L  X+Q1705 R0 FMAX M91
36 FN 9: IF +0 EQU +0 GOTO LBL "SCHWENKEN"
37 LBL "GRAD_270"
38 FN 28: TABREAD Q1705 =50 /"WERT"
39 L  X+Q1705 R0 FMAX M91
40 L  Z+Q1707 R0 FMAX M91
41 FN 9: IF +0 EQU +0 GOTO LBL "SCHWENKEN"
42 LBL "SCHWENKEN"
43 L  Y+Q1708 R0 FMAX M91
44 CYCL DEF 306 Gelenk C schwenken ~
    Q370=+Q1709 ;(0...360)
45 Q1900 = Q1700
46 FN 16: F-PRINT TNC:\DATEIEN\MASKEN\WKZ_WECHSEL.MSK / SCREEN:
47 TOOL CALL Q1700 Z SQ1701
48 FN 16: F-PRINT TNC:\DATEIEN\MASKEN\WKZ_WECHSEL.MSK / SCLR:
49 L  Z+Q1707 R0 FMAX M91
50 L  Y+Q1708 R0 FMAX M91
51 CYCL DEF 306 Gelenk C schwenken ~
    Q370=+Q1704 ;(0...360)
52 LBL "WKZ_RICHTIG"
53 FN 18: SYSREAD Q1703 = ID2000 NR20 IDX151
54 FN 10: IF +Q1703 NE +1 GOTO LBL "ACHSE_Z"
55 FN 18: SYSREAD Q1704 = ID2000 NR80 IDX2144
56 FN 9: IF +Q1704 EQU +0 GOTO LBL "ACHSE_Y"
57 FN 9: IF +Q1704 EQU +900 GOTO LBL "ACHSE_X"
58 FN 9: IF +Q1704 EQU +1800 GOTO LBL "ACHSE_Y"
59 FN 9: IF +Q1704 EQU +2700 GOTO LBL "ACHSE_X"
60 LBL "ACHSE_Y"
61 TOOL CALL Q1700 Y SQ1701
62 FN 9: IF +0 EQU +0 GOTO LBL "ENDE"
63 LBL "ACHSE_X"
64 TOOL CALL Q1700 X SQ1701
65 FN 9: IF +0 EQU +0 GOTO LBL "ENDE"
66 LBL "ACHSE_Z"
67 TOOL CALL Q1700 Z SQ1701
68 FN 9: IF +0 EQU +0 GOTO LBL "ENDE"
69 LBL "KEIN_KOPF"
70 Q1900 = Q1700
71 FN 16: F-PRINT TNC:\DATEIEN\MASKEN\WKZ_WECHSEL.MSK / SCREEN:
72 TOOL CALL Q1700 Z SQ1701
73 FN 16: F-PRINT TNC:\DATEIEN\MASKEN\WKZ_WECHSEL.MSK / SCLR:
74 LBL "ENDE"
75 L  Z+Q1707 R0 FMAX M91
76 END PGM WKZ_WECHSEL MM 
ist Heidenhain Klartext ohne Einrückung ohne Text hervorhebung ohne genaue Variablen Kennzeichnung nur Parameter von Q0-Q99 und Q1600 - Q1900
soll zwar keine ausrede sein wenn man den obigen Code gewöhnt ist kommt man mit so ziemlich jeden zurecht.

aber die Änderungen werden übernommen.
Wenn das ganze Projekt zu 99% lauffähig ist wird an der Optimierung gearbeitet. (Ich weiß wenns einmal fertig ist wird nicht mehr umgeschrieben)
Peter
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Peter1977 hat geschrieben:Wenn das ganze Projekt zu 99% lauffähig ist wird an der Optimierung gearbeitet. (Ich weiß wenns einmal fertig ist wird nicht mehr umgeschrieben)
Die Regel geht üblicherweise so: First make it work. Then make it right. Then make it fast. -- Kent Beck
In specifications, Murphy's Law supersedes Ohm's.
Antworten