Scallierung von QtWidgets

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
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: 14493
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: 14493
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?
BlackJack

@Nobuddy: Was willst Du denn damit machen? Nicht das Du am Ende auf dieser Ebene Sachen löst die man eigentlich auf einer höheren Ebene wie `QAction` und dem `shortcut` dort lösen würde.
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

@BlackJack, da hast Du recht, Qt ist sehr umfangreich ....

Als Grundlage nehme ich das Tabellen-Beispiel von __deets__.
In der Tabelle kann ich mit TAB und den Richtungstasten, den Focus auf eine Zelle setzen. Klicke ich mit der Maus auf eine bestimmte Zelle, wird der Zelleninhalt ausgegeben.

Ich würde nun gerne, den kompletten Datensatz mir ausgeben lassen, wenn ich mit Enter bzw. KP_Enter die ausgewählte Zelle bestätige.
Wie es mit tk funktioniert ist mir bekannt, aber mit Qt habe ich momentan keine Ahnung.
BlackJack

@Nobuddy: Ich würde sagen da musst Du wohl von `QTableView` erben und beispielsweise `keyReleaseEvent()` überschreiben. Enter kann übrigens mit der vorhandenen Tastenverarbeitung in Konflikt geraten wenn Du die Tabelle bearbeitbar machst.

Edit: Und sollte das letztendlich darauf hinauslaufen, dass Du für die ausgewählte Zeile einen Dialog zum bearbeiten öffnen möchtest, dann würde ich doch über ein `QAction` gehen, denn normalerweise bieten GUIs für so etwas ja eine Schaltfläche und ein Kontextmenü (und meistens auch einen Doppelklick).
Nobuddy
User
Beiträge: 994
Registriert: Montag 30. Januar 2012, 16:38

@BlackJack, ja der Gedanke ist einen Dialog zu öffnen, in dem der ausgewählte Datensatz bearbeitet werden kann.
In dem Tabellen-Beispiel sind ja die Zellen schreibgeschützt und das ist auch gut so, denn Änderungen würde ich gerne über einen Dialog machen.

Momentan setzte ich zum Bearbeiten eines Datensatzes aus einer Tabelle in tk, dies mit tk.Checkbutton um. Mit dem tk.Checkbutton wähle ich den betreffenden Datensatz aus und wähle über ein tk.Button, den betreffenden Workshop aus. Ich weiss nicht, ob das mit Qt und Checkbutton auch möglich wäre?
Die Bearbeitung einzelner Zellen erfolgt durch Selektion der Zelle und einem Enter. Dadurch öffnet sich ein Dialog zum Bearbeiten der Zelle.

Ich habe da schon für QAction nach Infos gegoogelt. Die Infos sind für einen Qt-Aussenstehenden nicht ganz verständlich.
Hier habe ich ein Beispiel mit QAction gefunden, mir ist nur noch nicht klar, wo ich da ansetzen muss.

Code: Alles auswählen

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class menudemo(QMainWindow):
   def __init__(self, parent = None):
        super(menudemo, self).__init__(parent)
        
        layout = QHBoxLayout()
        bar = self.menuBar()
        file = bar.addMenu("File")
        file.addAction("New")
        
        save = QAction("Save",self)
        save.setShortcut("Ctrl+S")
        file.addAction(save)
        
        edit = file.addMenu("Edit")
        edit.addAction("copy")
        edit.addAction("paste")
        
        quit = QAction("Quit",self) 
        file.addAction(quit)
        file.triggered[QAction].connect(self.processtrigger)
        self.setLayout(layout)
        self.setWindowTitle("menu demo")
        
   def processtrigger(self,q):
        print(q.text()+" is triggered")
        
def main():
    app = QApplication(sys.argv)
    ex = menudemo()
    ex.show()
    sys.exit(app.exec_())
    
if __name__ == '__main__':
    main()
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Statt abzuleiten empfehlen sich bei Qt inzwischen die EventFilter. Zusammen mit den Signalen aus der Selection des Views solltest du da etwas basteln koennen.
Antworten