Seite 2 von 4

Re: Scallierung von QtWidgets

Verfasst: Dienstag 27. Juni 2017, 15:43
von BlackJack
@Nobuddy: Und was hat das jetzt damit zu tun das Eingabefelder ihre Grösse nicht ihrem Inhalt anpassen?

Re: Scallierung von QtWidgets

Verfasst: Dienstag 27. Juni 2017, 16:04
von Nobuddy
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?

Re: Scallierung von QtWidgets

Verfasst: Dienstag 27. Juni 2017, 16:43
von Nobuddy
Das mit der Ausgabe Breite, habe ich herausgefunden.
"window.line_edit_0.minimumSize().width()"

Re: Scallierung von QtWidgets

Verfasst: Dienstag 27. Juni 2017, 16:51
von BlackJack
@Nobuddy: Das klingt falsch das Du da irgendwas machen musst. Um Grössen sollte sich das Layout kümmern.

Re: Scallierung von QtWidgets

Verfasst: Dienstag 27. Juni 2017, 17:16
von Nobuddy
@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_()

Re: Scallierung von QtWidgets

Verfasst: Dienstag 27. Juni 2017, 18:54
von 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.

Re: Scallierung von QtWidgets

Verfasst: Mittwoch 28. Juni 2017, 10:01
von Nobuddy
@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.

Re: Scallierung von QtWidgets

Verfasst: Mittwoch 28. Juni 2017, 10:20
von 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.

Re: Scallierung von QtWidgets

Verfasst: Mittwoch 28. Juni 2017, 10:47
von Nobuddy
@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.

Re: Scallierung von QtWidgets

Verfasst: Mittwoch 28. Juni 2017, 11:02
von __deets__
Es gibt auch noch den QTableView. Wenn du schon mit tabellarischen Daten arbeitest.

Re: Scallierung von QtWidgets

Verfasst: Mittwoch 28. Juni 2017, 12:02
von Nobuddy
QTableView, habe ich im Designer auch schon mal in der Hand gehabt, da habe ich aber noch keine Ahnung wie das umgesetzt wird.

Re: Scallierung von QtWidgets

Verfasst: Mittwoch 28. Juni 2017, 13:00
von __deets__
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

Re: Scallierung von QtWidgets

Verfasst: Mittwoch 28. Juni 2017, 13:19
von Nobuddy
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

Re: Scallierung von QtWidgets

Verfasst: Mittwoch 28. Juni 2017, 14:27
von Nobuddy
@__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.

Re: Scallierung von QtWidgets

Verfasst: Donnerstag 29. Juni 2017, 09:07
von Nobuddy
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?

Re: Scallierung von QtWidgets

Verfasst: Donnerstag 29. Juni 2017, 09:52
von 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.

Re: Scallierung von QtWidgets

Verfasst: Donnerstag 29. Juni 2017, 10:38
von Nobuddy
@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.

Re: Scallierung von QtWidgets

Verfasst: Donnerstag 29. Juni 2017, 11:19
von 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).

Re: Scallierung von QtWidgets

Verfasst: Donnerstag 29. Juni 2017, 12:52
von Nobuddy
@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()

Re: Scallierung von QtWidgets

Verfasst: Donnerstag 29. Juni 2017, 13:04
von __deets__
Statt abzuleiten empfehlen sich bei Qt inzwischen die EventFilter. Zusammen mit den Signalen aus der Selection des Views solltest du da etwas basteln koennen.