Das Arbeiten mit der Liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute, ich möchte mit einer Liste arbeiten. Zunächst mein kleiner Quelltext:

Code: Alles auswählen


    def create_movie_form(self):
        self.movie_form = Movie_Window(self)
        self.movie_form.setAttribute(Qt.WA_DeleteOnClose)
        self.movie_form.show()

        self.create_subwindow_list(self.movie_form)

    def show_search_form(self):
        self.search_form = Search_Window(self)
        self.search_form.setAttribute(Qt.WA_DeleteOnClose)
        self.search_form.show()

        self.create_subwindow_list(self.search_form)

    def create_window_list(self, windows):
        Liste = list()
        Liste.append(windows)
        for Element in Liste :
            print "Formen: ", str(Element)
            print "Anzahl:", len(Liste)

Formen: <files.modules_ui.ui_pp_movie.Movie_Window object at 0x029DBED0>
Anzahl: 1
Jedesmal, wenn ich ein Fenster öffne (MDI-Anwendung), soll das Unterfenster in die Liste eingetragen werden (create_window_list). Ich öffne nun zwei Unterfenster, einmal create_movie_form und create_search_form. Und damit ich es kontrollieren kann, ob Unterfenster zu der Liste hinzugefügt wurden, und wie viele sich gerade in der Liste befinden, soll er sie mir per Print-Anweisung die Informationen ausgeben. Das "komische" daran ist, dass er jedesmal sagt, es sei nur ein Fenster in der Liste, und zeigt das Fenster auch an. Was mache ich falsch? Rein theoretisch müssten aber die Anzahl bei 2 liegen und beide Objekte müssten in die Liste hinzugefügt und anschließend aufgelistet werden.

Denn bei meiner Mini-Probe funktioniert es wunderbar:

Code: Alles auswählen

def add_more_f1():
    f1 = "form1"
    add_to_list(f1)

def add_more_f2():
    f2 = "form2"
    add_to_list(f2)

def add_more_f3():
    f3 = "form3"
    add_to_list(f3)

def add_to_list(names):
    langs = list()
    langs.append(names)
    for element in langs:
        print "Formen: ", str(element)

add_more_f1()
add_more_f2()
add_more_f3()
Formen: form1
Formen: form2
Formen: form3
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dein Beispiel tut nicht das, was du denkst. In der Liste steckt immer nur ein Element das aufgerufen wird. Überlege doch mal wo du langs definierst. Da kann nie mehr als ein Wert in der Liste sein. Du erstellst durch den dreimaligen Aufruf der Funktion dreimal eine neue Liste, fügst jeweils ein Element hinzu und gibst das dann aus. Nach dem Verlassen der Funktion existiert die Liste nicht mehr.
BlackJack

@Sophus: Deine ”Miniprobe” funktioniert doch auch nicht, auch dort ist immer nur ein Element in der Liste. Was ja auch kein Wunder ist wenn man eine neue Liste erstellt und dort ein Element rein steckt, dann ist da eben auch nur ein Element drin. Das wäre auch sehr komisch wenn das anders wäre.

Mal davon abgesehen würde ich die Liste im ersten Beispiel in Frage stellen. Wozu soll die gut sein?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

BlackJack hat geschrieben:@Sophus: Deine ”Miniprobe” funktioniert doch auch nicht, auch dort ist immer nur ein Element in der Liste. Was ja auch kein Wunder ist wenn man eine neue Liste erstellt und dort ein Element rein steckt, dann ist da eben auch nur ein Element drin. Das wäre auch sehr komisch wenn das anders wäre.

Mal davon abgesehen würde ich die Liste im ersten Beispiel in Frage stellen. Wozu soll die gut sein?
Jetzt kapiere ich es. Verdammt. Danke euch.
Inwiefern stellst du die Liste in Frage? Hat sie ihre Grenzen bzw. Nachteile?
BlackJack

@Sophus: Ich verstehe den Sinn der Liste nicht. Warum willst Du die Fenster in einer Liste sammeln? Was passiert mit den Objekten in der Liste wenn der Benutzer ein Fenster schliesst?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Ich habe einen Weg gefunden, wie ich das Verhalten der Unterfenster in der MDIArea beeinflussen kann. Üblicherweise ist es so, dass, wenn man ein Unterfenster maximiert öffnet, dass andere Unterfenster, die im Anschluss geöffnet werden, sich an das vorherige Unterfenster anpasst, und sich somit selbst maximiert, obwohl ich im Code explizit gesagt habe, dass das Fenster normal geöffnet werden soll und zwar mit showNormal. Andersrum, wenn man die Unterfenster-Größen fixiert, so werden Unterfenster, die maximiert angezeigt werden, dann nicht mehr maximiert angezeigt. Egal wie ich es drehe und wende, nichts bringt mich weiter. Ich weiß auch, dass dies im Grunde ein normales Verhalten eines MDI-Bereiches ist. Ich kenne dieses Verhalten auch in VB6. Jedoch möchte ich das nicht. Es sollen bestimmte Unterfenster in der MDI maximiert angezeigt werden, und gleichzeitig andere Fenster normal angezeigt werden. Wer das nun gut oder schlecht findet, spielt keine Rolle :-) Also wimmel ich jegliche Diskussion ab.

Also habe ich mir einen Weg überlegt, wie ich das Unterfenster so aussehen lassen kann, als sei es maximiert geöffnet und die anderen Unterfenster sollen ihre normal Größe beibehalten. Das heißt, die maximierten Unterfenster werden in diesem Sinne "manipuliert". Und wenn ich dann das MDI-Hauptfenster dann an der Größe ändere (Stichwort resizeEvent), dann sollen die "maximierten" Unterfenster sich mit "bewegen", das heißt, sie sollen sich beim resizeEvent des MDI-Hauptfenster immer dem Hauptfenster anpassen. Dazu "sammel" ich alle Unterfenster in einer Liste. Und alle in der Liste befindlichen Unterfenster werden dann mit bewegt. Damit ich etwas Ressourcen sparen kann, sollen auch nur jene Unterfenster mit bewegt werden, die in die Liste hinzugefügt wurden. Beim Schließen eines Unterfensters wird dieses wieder aus der Liste gelöscht.
BlackJack

@Sophus: Ich vermute ja fast wieder trollen, aber mach das mal so. Ist ja nicht so als wenn es genau dafür was gäbe… ;-)
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Deine Vermutungen sind haltlos :-) Keine Ahnung wie du auf solche Vermutungen kommst. Aber was genau gäbe es denn dafür? Also für meine Vorstellung? Ich lass mich gern aufklären.
BlackJack

@Sophus: Das steht in der Dokumentation für QMdiArea. Einfach mal aufmerksam durchlesen. Oder nach passenden Stichworten durchsuchen (und aufmerksam lesen).

Edit: Bei dem Quelltext aus dem ersten Beitrag fehlt für meinen Geschmack das verhindert wird das ein weiteres Fenster geöffnet wird wenn das schon mal offen ist. Oder es macht keinen Sinn das Fenster an das Objekt zu binden. Eines von beidem sollte man machen/lassen.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Leider konnte ich für mein Problem nichts finden. Habe mich auch auf StackOverFlow ausgetobt - erfolglos. Kannst du mir bitte ein paar Stichworte bzw. Methoden nennen, damit ich in der Dokumentation nachlesen kann?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Sophus:
Was Du haben möchtest, klingt eher wie die Funktionalität eines QMainwindow mit centralWidget und seinen stackbaren Seitenwidgets. Falls Du tatsächlich in der Lage sein möchtest, mehrere centralWidgets offen zu haben, kann man dieses mittels TabWidgets oder StackedWidget + Tabbar abbilden. Deine Verrenkungen mit QWorkspace bzw. der Mdiarea haben irgendwie ein "Gschmäckle".
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@jerch: Mein Anliegen scheint sehr selten zu sein. Übrigens, arbeite ich jetzt doch mit MDIArea, auch wenn ich darüber nicht erfreut bin :-) Egal. Ich habe Google schon mehrere Tage missbraucht und nichts gefunden, was meine Vorstellung treffen könnte. Und dann traf ich auf die QTabbar, jedoch will ich das auch nicht. Was soll ich mit sowas? Es soll nicht aussehen wie ein Browser, das für jedes Fenster eine Tab erstellt wird. Ich denke, ich bleibe vorerst auf meine "Verrenkung", denn so werden die Fenster dargestellt, wie ich sie haben will :-) Aber trotzdem danke.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Diese Bsp. und speziell dieses kennst Du, oder?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@jerch: Ja, aber so will ich es eben nicht haben. Ist mir zu "komisch" :-)

Ich habe mal meine Anwendung abgeknipst (Screenshot - für diejenigen, die Englisch vermissen :-D)

http://www.bilder-upload.eu/show.php?fi ... 994108.jpg

So will ich sie handhaben, dass der maximierte Unterfenster im Hintergrund weiterhin maximiert bleibt, während das andere Unterfenster im Vordergrund ihre Größe beibehalten kann.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Sophus:
Also das Bild macht mir ja ein bisschen Angst vor den MVC-Fragen, die da noch kommen werden ;)

Ich versteh nicht, was Du mit dem Bild in Bezug auf "...dass der maximierte Unterfenster im Hintergrund weiterhin maximiert bleibt, während das andere Unterfenster im Vordergrund ihre Größe beibehalten kann." meinst. Ich sehe im Bild nur ein Widget, welches im centralWidget kein Layout hat und einen Dialog davor. Dialoge sind per se modal, es sei denn man möchte Interaktion mit anderen Elementen erlauben. Das hat aber nichts mit MDI zu tun, da ein Dialog ein eigenständiges Fenster ist. Welcher Teil soll MDI werden?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@jerch: Was zum Kuckuck ist ein MVC? Und nein, es ist kein Dialog, sondern ein QWidget, welches dort innerhalb des MDI-Bereich angezeigt wird - beide Unterfenster sind also im MDIArea-Widget. Würde ich mein hinteres Unterfenster nicht modifizieren, dann würde sich das kleine Unterfenster sich ebenfalls maximieren - ganz automatisch. Wenn du es nicht nachvollziehen kannst, dann bastel doch mal fix ein MDI-Fenster, zwei Unterfenster, wo hingehend einer maximiert angezeigt wird, und öffne dann mal das zweite Fenster normal und schau was passiert :-) Das zweite Fenster wird sich auch maximieren. Und genau das will ich eben nicht :-) Und die anderen Beispiele sind nicht das, was ich mir vorstelle. Dies entspricht eben nicht meinem "Geschmack". Und darüber brauchen wir uns nicht streiten :-)
BlackJack

@Sophus: Wie schön das das was Du möchtest von `QMdiArea` schon unterstützt wird. Man muss es ihm nur sagen. :-D
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Eigentlich warte ich immer noch auf deine Stichworte, wonach ich suchen soll. Bitte sag mir jetzt nicht SubWindowView und/oder TabbedView als Stichworte :-)
BlackJack

@Sophus: Da kommst Du schon selbst drauf. Ich habe Vertrauen in Deine Fähigkeiten. :-)
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: In 1354684764321558 Jahren werde ich ganz bestimmt drauf kommen :-)
Antworten