Grundsätzliche Frage zu Qt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
StMan
User
Beiträge: 38
Registriert: Sonntag 11. Januar 2026, 17:48

Hallo zusammen,
ich habe meine ersten Anfänger Versuche mit pyside6-designer gemacht, und habe ein Fenster mit Buttons, Entrys usw. erstellt. Dann die .ui in .py convertiert. Soweit OK. Nun habe ich gelesen man sollte in der convertierten nichts ändern, also habe ich sie in mein main importiert.
Nun die Fragen:
Muß ich die ganzen Classen die in der convertierten .py stehen auch in meinem main importieren?
Wie kann ich z.B. in meinem main die FontFarbe FrameFarbe ändern ?
Gruß Manfred
Benutzeravatar
__blackjack__
User
Beiträge: 14319
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@StMan: Ich würde da nichts in Quelltext umwandeln, sondern die *.ui-Datei zur Laufzeit in das Programm laden. Bei PySide nimmt man dafür einen `QUiLoader`.

Man kann keine Klassen importieren, nur Module. Wenn Du ein Modul importierst wird der komplette Inhalt des Moduls ausgeführt. Man kann nicht selektiv nur Teile von dem Code auf Modulebene ausführen lassen.

Um was an den GUI-Objekten zu ändern, musst Du das entsprechende Objekt in die Finger bekommen, und dann die entsprechenden Methoden verwenden. Wenn es nicht das Widget ist was die anderen Widgets enthält, denn das bekommt man ja problemlos in die Finger, kann man beispielsweise die `findChild()` oder `findChildren()` Methoden von `QObject` verwenden um Widgets über den Namen zu finden, den man im Designer vergeben hat.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Benutzeravatar
StMan
User
Beiträge: 38
Registriert: Sonntag 11. Januar 2026, 17:48

ich habe nun die .ui in mein main nach vielen Fehlversuchen eingebunden, und es funktioniert soweit auch.
Nun habe ich ein Problem das ich nicht lösen kann. Wenn ich Daten in eine QListWidget einlese, habe ich nach jedem Eintrag eine Leerzeile die ich nicht weg bekomme.
Die gleichen Daten bei tk.listbox machten keine Probleme.
Gruß Manfred
Benutzeravatar
__blackjack__
User
Beiträge: 14319
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wohl eher _in_ jedem Eintrag, weil da ziemlich wahrscheinlich ein Zeilenende-Zeichen am Ende jeder Zeile ist. Wobei das auch bei Tk ”probleme” macht, denn dort führt das zwar nicht zu einer neuen Zeile, aber es wird als schwarzes Kästchen nach dem Text im Eintrag angezeigt.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Benutzeravatar
snafu
User
Beiträge: 6943
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@StMan:
Beim zeilenweisen Einlesen bleiben die Newline-Zeichen erhalten. Du kannst das lösen, indem du für jede Zeile die Methode strip() aufrufst. Normalerweise hätte ich rstrip() empfohlen, um möglicherweise gewollten Whitespace am Zeilenanfang zu beizubehalten. Aber da es Listeneinträge sind, dürfte strip() hier besser passen.
Benutzeravatar
StMan
User
Beiträge: 38
Registriert: Sonntag 11. Januar 2026, 17:48

@snafu strip() habe ich probiert, nützt aber nichts.
Gruß Manfred
Benutzeravatar
snafu
User
Beiträge: 6943
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ein "funktioniert nicht" trägt leider nur sehr bedingt zur Lösungsfindung bei. Könntest du den Vorgang des Einlesens und Hinzufügen zum Widget auf ein Minimum herunterbrechen (also so damit das Problem dort tatsächlich noch auftritt) und diesen dann zur Ursachenforschung bitte hier reinstellen? Hilfreich wäre auch ein eingefügtes ``print(eintrag)``, damit man sieht, ob die Leerzeilen auch bei der Ausgabe auf der Kommandozeile mit angezeigt werden. ``print(repr(eintrag))`` ginge auch, damit man sozusagen die Rohform des Strings sehen kann ("repr" = "representation", quasi eine Ausgabe zum Debuggen).
Benutzeravatar
StMan
User
Beiträge: 38
Registriert: Sonntag 11. Januar 2026, 17:48

damit erscheint pro Eintrag eine Leerzeile.

Code: Alles auswählen

 if self.connection.is_connected():
                self.update_status(f"Verbunden mit Localhost", col=1)
                cursor = self.connection.cursor()
                cursor.execute("SHOW DATABASES")               
                self.ui.DBView.clear()                 
                # 1.Checkbox überprüfen
                if self.ui.checkBox.isChecked():
                    system_dbs = set() # Leere Menge -> alle DBs werden angezeigt
                    self.update_status(f"Alle Datenbanken werden angezeigt", col=1)  
                else:
                    system_dbs = self.system_db_list 
                    self.update_status(f"Nur eigene Datenbanken werden angezeigt", col=1)  
                for (db_name,) in cursor:
                    db_name = db_name.strip()  # Entfernt \n, \r und Leerzeichen am Ende
                    if db_name not in system_dbs:   # Filter greift nur, wenn system_dbs nicht leer ist
                        self.ui.DBView.addItem(db_name) 
Das ist der Print(rep(db_name))
'Backup'
'information_schema'
'mysql'
'performance_schema'
'phpmyadmin'
'prgdaten'
'test'
Gruß Manfred
Benutzeravatar
StMan
User
Beiträge: 38
Registriert: Sonntag 11. Januar 2026, 17:48

ich kann auch nicht den Menüeintrag "Beenden" aktivieren. Habe actionBeenden triggered() eingestellt.
Gruß Manfred
Antworten