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!
QListWidget/QScrollArea mit einigen QGroupbox füllen
@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!?
- Madmartigan
- User
- Beiträge: 200
- Registriert: Donnerstag 18. Juli 2013, 07:59
- Wohnort: Berlin
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?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
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.
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!
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!
- Madmartigan
- User
- Beiträge: 200
- Registriert: Donnerstag 18. Juli 2013, 07:59
- Wohnort: Berlin
Richtig, damit macht die Funktion aber exakt das, was sie machen soll.Tyll hat geschrieben:[...]Die Funktion setWidget() von QScrollArea ersetzt aber leider immer das vorher hinzugefügte Objekt mit dem neunen.[...]
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: Dann bräuchten wir wohl mal ein minimales aber lauffähiges Beispiel Deines Problems.
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.
Grund: Quelltext in Python-Code-Tags gesetzt.
@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.
- 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.
Setze QScrollArea.setWidgetResizable(True) und dein Beispiel funktioniert.