QListWidget/QScrollArea mit einigen QGroupbox füllen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Tyll
User
Beiträge: 21
Registriert: Dienstag 6. August 2013, 12:52

Hi Leute :),

Ich bin immoment für ein Programm die GUI am verfeinern (schönheits korrekturen, bessere übersichtlichkeit...)
So jetzt zu dem Problem ! Es können der GUI je nach bedarf Groupbox Elemente hinzugefügt werden, da die Anzahl unbeschränkt ist kann es vorkommen das die GUI zu groß wird und nicht mehr komplett auf dem Bildschirm angezeigt werden kann.

Dem möchte ich entgegenwirken, indem ich diese Elemente einem QListWidget/QScrollArea hinzufüge, leider können diese Beiden keine QLayout verwenden. Habt ihr viellecht ne idee wie ich das umgehen kann oder eine Andere möglichkeit mein Problem zu lösen!
BlackJack

@Tyll: Ich weiss nicht ob ich das Problem richtig verstehe aber kann es sein dass Du einfach noch nicht darauf gekommen bist die Sachen nicht direkt in das ScrollArea zu stecken sondern in ein Widget und das dann in das ScrollArea!?
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Tyll hat geschrieben:Dem möchte ich entgegenwirken, indem ich diese Elemente einem QListWidget/QScrollArea hinzufüge, leider können diese Beiden keine QLayout verwenden
Das ist so nicht ganz korrekt, nur funktionieren gerade diese beiden QWidgets etwas anders, was Child-Elemente anbelangt. QGroupbox Widgets als Items in ein QListWidget zu packen, halte ich nicht für sinnvoll. Machbar ist es zwar, aber wozu der Aufwand?

QScrollArea ist doch der ideale Kandidat für expandierende UIs. Schau dir die Referenz zur QScrollArea und speziell setWidget() an, dann siehst du wie das Widget verwendet wird. Die Kontrolle über die Anordung der Items per QLayout ist definitiv möglich.
Tyll
User
Beiträge: 21
Registriert: Dienstag 6. August 2013, 12:52

Also ich hab jetzt ein paar kleine Änderungen gemacht die leider das Problem noch nicht ändern.

Ich füge jetzt dem QScrollArea ein QGroupBox hinzu, so lange es bei einer GroupBox bleibt funktioniert es auch.
Die Funktion setWidget() von QScrollArea ersetzt aber leider immer das vorher hinzugefügte Objekt mit dem neunen.
Ich habe auch schon versucht dem QScrollArea erst ein LayOut zu zuweisen und dann diesem Layout mehrere meiner Groupboxen.
Das funktioniert auch ohne Fehlermeldung leider werden keine Objekte angezeigt :/

Vielleicht stehe ich nur auf dem Schlauch aber irgentwie sehe ich keine schnelle lösung für mein Problem!
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Tyll hat geschrieben:[...]Die Funktion setWidget() von QScrollArea ersetzt aber leider immer das vorher hinzugefügte Objekt mit dem neunen.[...]
Richtig, damit macht die Funktion aber exakt das, was sie machen soll. ;-)

Du benötigst ein QWidget, QFrame oder was auch immer du als Container verwenden möchtest, du setzt dessen SizePolicy entsprechend auf Expanding, gibst dem Objekt das gewünschte Layout, dem Layout fügst du deine GroupBoxen hinzu und rufst dann die Funktion QScrollArea.setWidget(DeinContainerWidget) auf.
Tyll
User
Beiträge: 21
Registriert: Dienstag 6. August 2013, 12:52

Danke für die Hilfe hab es jetzt auch so umgesetzte aber leider wird weiterhin kein Element in dem ScrollArea dargestellt!
BlackJack

@Tyll: Dann bräuchten wir wohl mal ein minimales aber lauffähiges Beispiel Deines Problems.
Tyll
User
Beiträge: 21
Registriert: Dienstag 6. August 2013, 12:52

So ich hoffe das ist ok so sonst muss ich es noch mehr kurzen und ich habe in diesem Fall eine leere grouobox hinzugefügt

Code: Alles auswählen

from __future__ import unicode_literals
import sys, os, random
from PyQt4 import QtGui, QtCore, Qt
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np

import pyqtgraph as pg

import serial
import io
import time
import threading

class ApplicationWindow(QtGui.QMainWindow):
    
    #GUI Elemente
    EinstellungenCombo  = None
    statusLabel         = None

    #Klassen Objekte
    Einstellungen       = []
    LadeEinstellungen   = None

    #Eigenschaften
    baudratenListe      = '2400 4800 9600 14400 19200 28800 38400 57600 76800 115200 230400 250000'

    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.setWindowTitle("application main window")

        #Erstelle Menuepunt Quit 
        self.file_menu = QtGui.QMenu('&File', self)

        #Erstelle Menuepunkt Help
        self.main_widget = QtGui.QWidget(self)

        mainGuiLayoutSettings = QtGui.QGridLayout()

        PlotAnzahlButton = QtGui.QPushButton("Plot hinzufuegen")      
        PlotAnzahlButton.clicked.connect(lambda: containerLayout.addWidget(QtGui.QGroupBox()))

        darstellungButton = QtGui.QPushButton("Darstellungs Einstellungen hinzufuegen")
        geraetButton = QtGui.QPushButton("Geraet Einstellungen hinzufuegen")

        mainGuiLayoutSettings.addWidget(PlotAnzahlButton    ,0,0)
        mainGuiLayoutSettings.addWidget(darstellungButton   ,0,1)
        mainGuiLayoutSettings.addWidget(geraetButton        ,0,2)

        
        
        GUILayout = QtGui.QVBoxLayout(self.main_widget)

        mainBlub = QtGui.QGridLayout()
        

        GUILayout.addLayout(mainGuiLayoutSettings)
        scrollArea = QtGui.QScrollArea()
        GUILayout.addWidget(scrollArea)

        containerWidget = QtGui.QWidget()
        containerWidget.setSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding)
        containerLayout = QtGui.QBoxLayout(QtGui.QBoxLayout.TopToBottom)
        


        containerWidget.setLayout(containerLayout)
        scrollArea.setWidget(containerWidget)
        

        self.main_widget.setFocus()
        scrollArea.show()
        self.setCentralWidget(self.main_widget)

        self.statusBar().showMessage("All hail matplotlib!", 2000)

        print QtGui.QDesktopWidget().screenGeometry()



print "----------------------"
print "Programm -> Start"
print "----------------------"

qApp = QtGui.QApplication(sys.argv)

aw = ApplicationWindow()
aw.setWindowTitle("Test")
aw.show()
print "Programm -> GUI Gestartet"
sys.exit(qApp.exec_())
#qApp.exec_()
print "----------------------"
print "Programm -> Ende"
Zuletzt geändert von Anonymous am Dienstag 1. Oktober 2013, 15:49, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Tyll: Bei http://qt-project.org/doc/qt-4.8/qscrol ... nd-layouts steht im zweiten Absatz was man machen muss wenn man dynamisch Widgets hinzufügen möchte, damit die auch angezeigt werden. :-)
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Also, abgesehen von der Nonkonformität des Codes ist das einzige Problem, welches du hast, ein Problem der Anzeige.
Setze QScrollArea.setWidgetResizable(True) und dein Beispiel funktioniert.
Tyll
User
Beiträge: 21
Registriert: Dienstag 6. August 2013, 12:52

Ja jetzt klappt es -.- :D
Habs wohl überlesen und nicht richtig verstanden

Danke für die Hilfe :)
Antworten