Spacer Probleme QGridLayout, mehrere Alignments anwenden

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
MattiBo
User
Beiträge: 7
Registriert: Mittwoch 27. März 2013, 15:44

Hey Leute,

ich habe ein Problem, beim erstellen eines GUI's mittels PyQt. Ich versuche das untenstehende GUI anhand eines QGridLayouts zu realisieren. Allerdings klappt es noch nicht so ganz, wie ich es mir vorstelle. Hier mein Code zu dem Layout:

Code: Alles auswählen

        self.e_Grid.addWidget(self.layout1, 0,0,2,1)
        self.e_Grid.addWidget(self.layout2, 0,1)
        self.e_Grid.setAlignment(self.e_Ortsteil, QtCore.Qt.AlignTop)
        self.e_Grid.addWidget(self.layout3, 1,1)
        self.e_Grid.setAlignment(self.layout1, QtCore.Qt.AlignTop)
        self.e_Grid.addItem(spacer, 2, 0, rowSpan=1, columnSpan=2)
        self.e_Grid.addWidget(self.layout4, 3,0)
        self.e_Grid.addWidget(self.layout5, 4,0)
Damit ihr eine Vorstellung habt, wie es aussehen soll, hier eine kleine Grafik zur Veranschaulichung:

Bild

Ich habe mehrere Frage diesbezüglich:

1. Wie muss ich spacer definieren, damit er sich den Platz zwischen den beiden oberen und unteren Reihen nimmt, sodass diese nicht über die höhe der QLabel wachsen?
2. Wie kann ich mehrere Alignments auf ein Widget anwenden? Bei Label 2 und 3 würde ich sowohl AlignTop als auch AlignRight anwenden wollen, aber sowohl sie mit Komma nacheinander zu schreiben als auch den Befehl zweimal ausführen bring leider nicht den gewünschten Effekt?

Gibt es denn zu dem Thema eine gute Dokumentation bzw. Tutorial? Die einzigen Sachen, die ich finde behandeln war "Layoutmanagment", beschreiben aber nur die Unterschiede zwischen den verschiedenen Layout-Typen. Und in der Qt - Dokumentation steht zu jeder Methode maximal ein Satz, dessen Zusammenhang mit anderen Modulen ich dann nicht verstehe.

Es wäre total lieb, wenn ihr mir weiterhelfen könntet. Vielen Dank im Vorraus.

Gruß
Matti
BlackJack

@MattiBo: Frage 1 habe ich nicht verstanden.

Zu 2.: Die Flags werden mit dem ``|``-Operator verknüpft.
MattiBo
User
Beiträge: 7
Registriert: Mittwoch 27. März 2013, 15:44

Danke BlackJack, das hat mir schon mal sehr weitergeholfen!

Nun zu Frage 1. Ich versuche sie etwas besser auszudrücken. Label 4 und Label 5 sollen an der Unterseite des Fensters fixiert werden. Die jeweiligen Gitter sollen aber nur so hoch wie das Label sein. Das selbe gibt mit den Reihen 0 und 1. Sie sollen nicht höher als deren Inhalt werden.
Wenn man nun das Fenster nach unten zieht soll also der neu-gewonnene Platz nur zwischen den Pfeilen entstehen. Sie sollten das Beispiel veranschaulichen.
Das heißt, dass sich die Höhe der Reihen 0,1,3,4 bei resizing nicht verändern soll sondern es soll sich nur die Höhe der Reihe 2 ändern. Ich habe es schon mit einem QSpacerItem versucht, allerdings habe ich es mit dem Item nicht hinbekommen.

Ich hoffe, man kann mein Anliegen nun besser verstehen.
BlackJack

@MattiBo: Mit einem Spacer sollte das aber eigentlich möglich sein. Erstell doch mal ein minimales aber lauffähiges Beispiel, dass Dein Problem illustriert, so dass man das nachvollziehen kann.
MattiBo
User
Beiträge: 7
Registriert: Mittwoch 27. März 2013, 15:44

Code: Alles auswählen

from PyQt4.QtGui import QApplication
from PyQt4 import QtGui, Qt, QtCore
import sys

class TestWidget(QtGui.QWidget):
    
    def __init__(self):       
        super(TestWidget, self).__init__()
        
        self.setWhiteBackground()
        self.makeUI()
                
        self.show()
        self.setWindowTitle("TestWidget")
        
    def setWhiteBackground(self):
        self.setAutoFillBackground(True)
        p = self.palette()
        p.setColor(self.backgroundRole(), QtGui.QColor(255,255,255))
        self.setPalette(p)
        
    def makeUI(self):
        self.grid = QtGui.QGridLayout()
        self.grid.setSpacing(10)
                
        self.e_Font = QtGui.QFont()
        self.e_Font.setBold(True)
        self.e_Font.setPointSize(50)
        
        self.label1 = QtGui.QLabel(u"Label 1")
        self.label1.setFont(self.e_Font)
        
        self.label3 = QtGui.QLabel(u"Label 3")
        self.label3.setFont(self.e_Font)
        
        self.label2 = QtGui.QLabel(u"Label 2")
        self.label2.setFont(self.e_Font)
        
        self.label4 = QtGui.QLabel(u"Label 4")
        self.label4.setFont(self.e_Font)
        
        self.label5 = QtGui.QLabel(u"Label 5")
        self.label5.setFont(self.e_Font)
        
        spacer = QtGui.QSpacerItem(20,20)
        
        self.grid.addWidget(self.label1, 0,0,2,1)
        self.grid.setAlignment(self.label1, QtCore.Qt.AlignTop)
        self.grid.addWidget(self.label2, 0,1)
        self.grid.setAlignment(self.label2, QtCore.Qt.AlignTop|QtCore.Qt.AlignRight)
        self.grid.addWidget(self.label3, 1,1)
        self.grid.setAlignment(self.label3, QtCore.Qt.AlignTop|QtCore.Qt.AlignRight)
        self.grid.addItem(spacer, 2, 0, rowSpan=1, columnSpan=2)
        self.grid.addWidget(self.label4, 3,0)
        self.grid.addWidget(self.label5, 4,0)
        
        self.setLayout(self.grid)

def main():    
    app = QApplication(sys.argv)
    test = TestWidget()
    sys.exit(app.exec_())


if __name__ == "__main__":
    main()
                
Ich hoffe, dass der Code weiterhilft. Ich glaube der einzige "Fehler" liegt jetzt in den Parametern des Spacers. Ich weiß allerdings nicht, welche Parameter man wählen muss. In der Dokumentation habe ich die Parameter nicht ganz verstanden.
BlackJack

@MattiBo: Du musst dem Sizer sagen in welche Richtung er expandieren darf:

Code: Alles auswählen

       spacer = QtGui.QSpacerItem(20, 20, vPolicy=QtGui.QSizePolicy.Expanding)
MattiBo
User
Beiträge: 7
Registriert: Mittwoch 27. März 2013, 15:44

Danke BlackJack, das hat mir sehr geholfen!
Antworten