Qt zweispaltiges Layout -> einspaltiges Layout

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hi Community,

ich steh vor einer wichtigen Designentscheidung:

Da mein Programm sowohl auf einem großen Monitor mit hoher Auflösung als auch auf einem kleinen Netbook laufen soll, will ich eben
  • 1. Auf einem großen Monitor wenig Verschnitt, sprich wenig Fläche die nicht genutzt wird.
    2. Auf einem kleinen Monitor trotzdem übersichtlich bleiben
So das ganze lässt sich mit einem Zweispaltigen Layout lösen, das wenn das Fenster zu klein wird zu einem einspaltigen Layout wird.

Eine grundsätzliche Frage: Würdet ihr auch so vorgehen oder gibt es alternative Ansätze?

Wie könnte man den Übergang benutzterfreundlich gestallten. Ich will nicht das Elemente wild umherspringen. Ein nettes Aus und ein Blenden wäre was nettes :P
Ich weiß es sind hier viele Leute an Bord, die solche Effekte verachten :)

Es ist nicht so, dass das was Neues ist. Ich habe das schon bei einigen Programmen gesehen.

Es wäre nett wenn ihr mir helfen könntet.

Grüße,
anogayales
lunar

Niemand kennt Deine Anwendung besser als Du, insbesondere da Du über die Anwendung nichts verrätst. Wenn Du also selbst schon nicht weißt, wie das Layout dieser Anwendung aussehen soll, wie zum Teufel sollte ein Dritter ganz ohne Hintergrundinformationen das dann wissen?! Was hast Du bei dieser Frage eigentlich als Antwort erwartet?!

Insofern bleibt es halt bei ein paar Allgemeinplätzen:

Der Versuch, den „Verschnitt“ bei großen Monitoren zu reduzieren, ist unsinnig. Fenster sollte nicht mit möglichst vielen Steuerelementen vollgestopft sein, damit möglichst viel Platz genützt wird, sondern im Idealfall genau eine Aufgabe oder einen Arbeitsablauf repräsentieren, egal wie viele Steuerelemente nötig sind, oder wie viel Platz ungenützt bleibt.

Ein Layout in Abhängigkeit von der Größe automatisch zu wechseln, ist für den Nutzer nicht unbedingt direkt nachvollziehbar, da die Größe des Fensters an vielen, nicht unbedingt offensichtlichen Umgebungseinstellungen hängt. Zudem hat jeder Nutzer auch andere Präferenzen, was die Fenstergröße angeht. Im Zweifelsfall sollte der Wechsel des Layouts also lieber explizit sein, indem der Nutzer beispielsweise in einen „kompakten Modus“ wechseln kann. Zusätzlich kann man optionale Bestandteile der GUI auch als andockbare Fenster implementieren, die der Nutzer selbst schließen oder wiederherstellen kann, oder die nur bei Bedarf eingeblendet werden.

Natürlich kann man auch Automatismen einbauen und ggf. das Layout automatisch wechseln, doch solche Automatismen müssen vom Nutzer akzeptiert werden, und demnach schon während der Entwicklung zusammen mit den späteren Nutzern oder zumindest mit irgendwelchen „Usability-Experten“ überprüft werden, und zwar umso mehr, je mehr Deine Anwendung auf Automatismen setzt oder je individueller die Oberfläche Deiner Anwendung erscheint. Es ist ja schließlich nicht Ziel Deiner Anwendung, möglichst alle Möglichkeiten der Layout-Verwaltung auszunutzen, und noch möglichst alle Features der Animations-API noch dazu, sondern Deinen Nutzern eine gute Oberfläche zu bieten.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Vielen Dank für deine Antwort!

Meine Anwendung zeigt Bilder an und da macht es schon Sinn möglichst viel Monitorfläche auszunutzen.

Das mit dem Kompaktmodus ist schonmal eine gute Idee :)

Ich werde mal ein bisschen weiter grübeln.

Grüße,
anogayales
lunar

@anogayales: Ich kann nicht erraten, was Deine Anwendung tut. Wenn Du Informationen um Ziel und Zweck Deiner Anwendung vorenthältst, darfst Du Dich nicht wundern, wenn unpassende Antworten kommen.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

@lunar: Tut mir leid, dass ich nicht zu Beginn mein Problem ausreichend geschildert habe.

Ich bin grade dabei eine art "Fade in" Animation zu realisieren. Eigentlich ganz einfach, aber leider animiert er mir nicht meine windowOpacity:

Code: Alles auswählen

#!/usr/bin/python

import sys
from PyQt4.QtCore import QPropertyAnimation
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)


visible = False

def create_buttons(layout):
    for number in range(10):
        layout.addWidget(QtGui.QPushButton("Pushing me does nothing"))

def fade_in():    
    fade_widget.setVisible(True)
    animation = QPropertyAnimation(fade_widget, "windowOpacity")
    animation.setDuration(2000)
    animation.setStartValue(0.0)
    animation.setEndValue(1.0)
    animation.start()


widget = QtGui.QWidget()
layout = QtGui.QVBoxLayout()
widget.setLayout(layout)

title_button = QtGui.QPushButton('Push me hard!')
title_button.clicked.connect(fade_in)


fade_widget = QtGui.QWidget()
fade_widget.setVisible(visible)
fade_in_layout = QtGui.QVBoxLayout()
fade_widget.setLayout(fade_in_layout)
create_buttons(fade_in_layout)


layout.addWidget(title_button)
layout.addWidget(fade_widget)

widget.show()

sys.exit(app.exec_())
Wäre nett wenn da mal jemand drüber gucken könnte!

Grüße,
anogayales
lunar

@anogayales: „Er animiert Dir Deine windowOpacity“ schon, nur wirkt sich diese Eigenschaft nur auf Fenster aus, nicht auf beliebige darin enthaltene Steuerelemente. Deswegen heißt es auch "windowOpacity" und nicht "widgetOpacity". Wie Du ein Steuerelement langsam einblenden kannst, weiß ich nicht aus dem Kopf heraus, da musst Du selbst suchen.

Im Übrigen solltest Du das "parent"-Argument im Konstruktor von QObject abgeleiteter Klasse immer sinnvoll belegen.
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hi lunar und alle anderen,

ich bin jetzt soweit gekommen, dass ich einen fade in effect von den widget elementen hinbekommen hab. Dazu musste man das Widget in einer GraphicsScene integrieren und konnte dann das WidgetProxy animieren.

Leider bekomm ich einen "Slide in effect" nicht richtig hin. Sprich ich möchte so ein Art aufklappen implementieren. Dabei weiß ich aber nicht wirklich was ich animieren soll. Animier ich das WidgetProxy bekomm ich einfach nur eine größere ScrollArea.

Animier ich die GraphicsView komm ich auch auf keinen grünen Zweig.

Hier mein Code. Dieser Code ist nur zu demonstrationszwecken da. :)

Code: Alles auswählen

import sys
from PyQt4.QtCore import QPropertyAnimation
from PyQt4.QtCore import QParallelAnimationGroup
from PyQt4 import QtGui
from PyQt4 import QtCore

app = QtGui.QApplication(sys.argv)

def create_buttons(layout):
    for number in range(10):
        button = QtGui.QPushButton("Pushing me does nothing")
        button.clicked.connect(proxy.opacity)
        layout.addWidget(button)

def fade_in():    
    proxy.setVisible(True)      
    parallel_animation.start()

widget = QtGui.QWidget()
layout = QtGui.QVBoxLayout()
widget.setLayout(layout)

title_button = QtGui.QPushButton('Push me hard!')
title_button.clicked.connect(fade_in)


fade_widget = QtGui.QWidget()
fade_in_layout = QtGui.QVBoxLayout()
fade_widget.setLayout(fade_in_layout)

scene = QtGui.QGraphicsScene()
view = QtGui.QGraphicsView(scene)
layout.addWidget(view)
proxy = scene.addWidget(fade_widget)
proxy.setVisible(False)

create_buttons(fade_in_layout)

animation = QPropertyAnimation(proxy, "opacity")
animation.setDuration(2000)
animation.setStartValue(0.0)
animation.setEndValue(1.0)

animation1 = QPropertyAnimation(view, "geometry") # Hier krachts!
animation1.setDuration(2000)
animation1.setStartValue(view.geometry())
animation1.setEndValue(QtCore.QRect(0,0,600,600))

parallel_animation = QParallelAnimationGroup()
parallel_animation.addAnimation(animation)
parallel_animation.addAnimation(animation1)

layout.addWidget(title_button)

widget.show()

sys.exit(app.exec_())
Es wäre nett wenn sich das mal jemand angucken könnte!

Grüße,
anogayales
Antworten