QVBoxLayout mit fixer und variabler Höhe

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
HeinKurz
User
Beiträge: 10
Registriert: Montag 20. März 2023, 22:09

Ich hab jetzt Google schon rauf und runter durchsucht aber finde keine Lösung:
Ich hab eine App mit einem QVBoxLayout mit 2 Reihen. Die 1. Reihe soll eine fixe Höhe haben, in der 2. soll eine QGroupBox sein, die den ganzen restlichen Platz nutzt.
Die fixe Höhe der 1. Reihe kann ich mit setMinimumSize erreichen. Aber wie erreiche ich, dass die QGroupBox #2 den maximalen Platz nutzt ???

Code: Alles auswählen

import sys
from PyQt5.QtWidgets import *  #QApplication, QDialog, QMainWindow, QMessageBox, QPushButton
from PyQt5 import QtWidgets
from PyQt5.QtCore import *
from PyQt5 import QtCore
from PyQt5.QtGui import *
from PyQt5 import QtGui

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setMinimumSize(1300, 900)
        self.setWindowTitle("TEST")
        vboxKS = QVBoxLayout()
        vboxKS.setAlignment(Qt.AlignHCenter)
        self.gbG1 = QGroupBox()
        self.gbG1.setTitle("#1")
        self.gbG1.setMinimumSize(500, 100)
        vboxKS.addWidget(self.gbG1)
        self.gbG2 = QGroupBox()
        self.gbG2.setTitle("#2")
        self.gbG2.setMinimumSize(500, 9999)
        vboxKS.addWidget(self.gbG2)
        widget = QWidget()
        widget.setLayout(vboxKS)
        self.setCentralWidget(widget)

    def resizeEvent(self, event):
        print(self.gbG1.size(), self.gbG2.size())

app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@HeinKurz: Sternchen-Importe sind Böse™. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen. Auch das Programme ”kaputt” gehen weil die Bibliotheken aktualisiert wurden und dann plötzlich andere Namen dazu kommen, die kollidieren können. Oder das man aus versehen etwas benutzt was von dem importiertem Modul selbst von woanders importiert wurde, und man sich damit eine nicht offensichtliche Abhängigkeit einhandelt.

`random`, `QtCore`, `QtGui`, und `QtWidgets` werden explizit importiert, aber nirgends verwendet.

Von `setMinimumSize()` sollte man in der Regel die Finger lassen. Die Grösse ergibt sich durch den Inhalt. Und bei Pixelangaben hat man immer das Problem das die tatsächliche Grösse davon stark schwanken kann, je nach Bildschirmgrösse, -auflösung, und Einstellungen. Das ist für Dummy-Widgets wie im Beispiel manchmal sinnvoll, aber nicht wenn da tatsächlich Inhalt mit einer eigenen Grösse drin dargestellt werden soll, der ja dann auch in die Pixelanzahl hinein passen muss.

Wenn man in einem QBoxLayout Elemente haben möchte die ”mitwachsen” muss man beim hinzufügen zum Layout einen Stretch-Faktor angeben.

Code: Alles auswählen

#!/usr/bin/env python3
import sys

from PyQt5.QtCore import QSize, Qt
from PyQt5.QtWidgets import (
    QApplication,
    QGroupBox,
    QMainWindow,
    QVBoxLayout,
    QWidget,
)


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("TEST")
        layout = QVBoxLayout()
        layout.setAlignment(Qt.AlignHCenter)
        self.groupboxes = []
        for stretch in range(2):
            box = QGroupBox(
                title=f"#{stretch + 1}", minimumSize=QSize(500, 100)
            )
            layout.addWidget(box, stretch)
            self.groupboxes.append(box)
        widget = QWidget()
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def resizeEvent(self, _event):
        print(*(box.size() for box in self.groupboxes))


def main():
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec()


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
HeinKurz
User
Beiträge: 10
Registriert: Montag 20. März 2023, 22:09

cool. danke dir.
Antworten