Scallierung von QtWidgets

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Hmm, gibt es denn überhaupt eine Lösung den Layoutmanager zu aktualisieren, oder sonst eine?
BlackJack

@Nobuddy: Ich verstehe ehrlich gesagt nicht was Du da eigentlich möchtest‽ Das sich Eingabefelder in der Grösse dem Inhalt anpassen wäre wie gesagt sehr ungewöhnlich. Die wählt man beim Entwurf so gross das die überwiegende Anzahl der Eingaben passt, beziehungsweise geht man einfach davon aus das nicht alles angezeigt wird wenn mehr eingegeben wird. Kennst Du eine GUI die sich nicht so verhält?
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

@BlackJack, habe mich vielleicht nicht richtig ausgedrückt.

Beim Starten der GUI, möchte ich die Widgets QLineEdit mit Daten aus eine Tabelle füllen. Die Textlänge kann hier sehr unterschiedlich sein.
Daher habe ich gedacht, dass eine Anpassung der GUI möglich sein müsste.
Mit tk funktioniert das bei mir.
BlackJack

@Nobuddy: Was machst Du denn in Tk?
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Ich habe da ein Modul geschrieben (ScreenCenter), dass die Fenstergrösse ermittelt und das Fenster im Bildschirm zentriert.

Code: Alles auswählen

        # Ermittlung der Fenstergröße, Zentrierung des Fensters auf dem Bildschirm
        x, y, hdw, hdh = ScreenCenter(self.screenx, self.screeny,
            self.xpos, self.ypos, self.button_counter).screen_center()
        self.my_win.geometry('{}x{}+{}+{}'.format(x, y, hdw, hdh))
        self.my_win.update()
BlackJack

@Nobuddy: Und was hat das jetzt damit zu tun das Eingabefelder ihre Grösse nicht ihrem Inhalt anpassen?
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Ich möchte wieder zum Eigentlichen zurück kommen.

Mit "window.line_edit_0.resize(400,115)" lässt sich das zumindest manuell bewerkstelligen.

Mit window.line_edit_0.minimumSize() kann ich mir die aktuelle Einstellung der Breite und Höhe anzeigen lassen.
Nur wie bekomme ich die Werte zur Verarbeitung heraus?
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Das mit der Ausgabe Breite, habe ich herausgefunden.
"window.line_edit_0.minimumSize().width()"
BlackJack

@Nobuddy: Das klingt falsch das Du da irgendwas machen musst. Um Grössen sollte sich das Layout kümmern.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

@BlackJack, und wie bekomme ich das Layout dazu?

Auch wenn es falsch ist, ist das bis jetzt meine einzige Lösung:

Code: Alles auswählen

if __name__ == '__main__':
    dialog = 'untitled.ui'
    app = QtWidgets.QApplication(sys.argv)
    window = Ui(dialog)
    # Setze Mindestbreite QLineEdit
    min_width = 200
    min_height = window.line_edit_0.minimumSize().height()
    window.resize(min_width, min_height)
    width2sign = round((200 / 19), 2)
    # Änderung Bezeichnung label_0
    window.label_0.setText("Lieferant")
    # Text
    text = "aaaaaaaaaaaaaaaaa sssssssssssssssssssssss ddd"
    # Berechnung und Aktualisierung der Mindestbreite für Text
    width = round(len(text) * width2sign)
    window.resize(width, min_height)
    # Füge Text in QLineEdit ein
    window.line_edit_0.setText(text)
    result = window.exec_()
BlackJack

@Nobuddy: Ich habe das Gefühl Du willst da sehr komische Sachen machen. Wenn Du am Ende sowieso alle Label und Eigenschaften der Eingabefelder wie die Breite ändern möchtest, dann ist das doch im Grunde fast genau so viel Code als wenn Du gleich den Dialog dynamisch im Programm erstellst.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

@BlackJack, klar wäre schön, wenn es da eine bessere Alternative geben würde.

Ich arbeite mit TAB-getrennten Listen.
Wenn es keine Alternative gibt, würde ich den längsten Text der Liste nehmen und dann "window.resize(width, min_height)" aktualisieren.
Ist der Text breiter als screenx, müsste man noch eine x-Scrollbar in Betracht ziehen.
BlackJack

@Nobuddy: Das ist immer noch komisch, ich kenne kein Programm das so etwas macht. Man weiss doch in etwa was die Länge eines Wertes ist. Und wenn sogar die Gefahr besteht, dass der Bildschirm nicht breit genug ist, dann ist ein `LineEdit` ganz einfach nicht das richtige Widget, denn das ist ja auch besch…eiden zu lesen und zu bearbeiten so eine einzelne laaaange Zeile für die man auch noch horizontal scrollen muss.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

@BlackJack, dafür gibt es dann wohl QTextEdit, wie ich gesehen habe.
Da stellt sich für mich auch die Frage, wie es mit expand in y aussieht.
Ich habe ja nicht immer den gleichen Text für diese Widget.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt auch noch den QTableView. Wenn du schon mit tabellarischen Daten arbeitest.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

QTableView, habe ich im Designer auch schon mal in der Hand gehabt, da habe ich aber noch keine Ahnung wie das umgesetzt wird.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na wattn Glueck, dass es so viele Beispiele dafuer gibt, an denen man sich das anschauen kann.

ZB http://www.python-forum.org/viewtopic.php?f=11&t=16817
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Ja das ist es wirklich ...., schönes Beispiel. :wink:
Das mit "import *" sollte man aktualisieren.

Code: Alles auswählen

from PyQt4.QtCore import Qt, QAbstractTableModel, SIGNAL
from PyQt4.QtGui import QWidget, QTableView, QApplication, QVBoxLayout
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

@__deets__, hast Du evtl. noch ein Beispiel für Binding?
Die Tabelle in dem Beispiel ist ja schreibgeschützt, was ja nicht verkehrt ist.
Wenn man nun sich einen Datensatz auswählt und mit Enter bestätigt, könnte man ja den Datensatz als Dataset in einer GUI ausgeben lassen, um diesen zu editieren.
Wenn es da etwas in der Richtung schon gebe, wäre ein oder mehrere Beispiele nicht schlecht.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

Habe mich mit dem Code-Beispiel http://www.python-forum.org/viewtopic.php?f=11&t=16817 auseinander gesetzt.
Manches beginne ich zu verstehen, bei manch anderem fehlt noch der Funke. :wink:

PyQt4 wurde ja durch PyQt5 ersetzt. Gibt es evtl., ein in etwa gleiches Code-Beispiel mit PyQt5?

Wie ich gesehen habe, gibt es kein Binding wie bei tk.
Dazu habe ich folgende Infos gefunden:
http://pyqt.sourceforge.net/Docs/PyQt5/
http://pyqt.sourceforge.net/Docs/PyQt5/ ... event.html
https://doc.qt.io/qt-5/qkeyevent.html
Hier habe ich erhebliche Probleme, vielleicht könnte jemand von Euch mir mit ein paar Beispielen helfen, dies beeser zu verstehen?
Antworten