Schatz, das verdammte Ding klemmt!

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Sophus:
Wenn wir Dir helfen sollen, muss Du schon minimalen lauffähigen Code zeigen, der das Problem beinhaltet. Sonst können wir das nicht nachvollziehen und es bleibt beim Rätselraten. Einzelne Codefetzen helfen da genauso wenig wie seitenweise Quelltext, den keiner lesen will.

Mit dem 2. Bild bin ich mir ziemlich sicher, dass Du Dir beide Probleme an anderer Stelle einhandelst. Ich vermute mal, dass Du sowohl das Schliessen der Mdi-Fenster als auch das Setzen des Icons nur auf Deinen Widgets vornimmst. Beides muss am MdiSubWindow passieren, da dieses für die Fensterrahmen/-behandlung zuständig ist. Im Falle des Icons erbt das MdiSubWindow einfach das Icon vom Hauptfenster, Dein Icon ist ja erst eine Ebene darunter gesetzt (schon wieder dieser Objektbaum ;) ).
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@jerch: Ich schwöre dir, zu Weihnachten werde ich diesen Objektbaum persönlich schmücken, mit Lametta, Kugeln und Krone. Und ihr könnt unter dem Objektbaum eure Geschenke platzieren :mrgreen: :lol: :) :D

Nun zum Problem. Das Problem konnte ich insofern lösen, als das ich mich von BlackJacks Alternative abgewandt habe, und wieder zu QMdiSubWindow übergegangen bin. Hier der Ausschnitt:
Modul: mdi.py

Code: Alles auswählen

    def create_search_form(self):
        from ..modules_ui.ui_pp_search import Search_Window
        # self.mdiArea.addSubWindow(Search_Window(self.up_to_date_it)).show() # Its original (BlackJack)
        mdi_subwindow_search = QMdiSubWindow()

        search_widget = Search_Window()
        mdi_subwindow_search.setAttribute(Qt.WA_DeleteOnClose)

        mdi_subwindow_search.setWidget(search_widget)
        self.mdiArea.addSubWindow(mdi_subwindow_search)
        search_widget.show()
Hier sehen wir, dass ich einfach nur BlackJacks Variante auskommentiert habe, und dazu übergegangen bin, die QMdiSubWindow-Klasse zu erstellen.

Modul: ui_pp_search.py

Code: Alles auswählen

class Search_Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.getPath_search_icon = os.path.join(os.path.abspath("."), 'files', 'images', 'img_16X16', 'Search.png')
        self.ui_pp_search.setWindowIcon(QIcon(self.getPath_search_icon))
Im Grunde habe ich nichts geändert. Wie gesagt, ich habe BlackJacks Variante nur ausgetauscht, und schon waren die Icons wieder da. Würde ich seine Variante wieder benutzen und alles andere auskommentieren, wären die Icons vom Hauptfenster wieder dort.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sophus: Wenn Du addSubWindow ein QWidget übergibst, wird intern genau das selbe gemacht, wie Du hier umständlich von Hand. Die eine Zeile von BlackJack macht also exakt das selbe, wie die 8 Zeilen von Dir. Warum ist getPath_search_icon ein Attribut? Und warum wird es vom aktuellen Pfad aus referenziert? Da Dateien sowieso immer vom aktuellen Verzeichnis aus gesucht werden, kannst Du das abspath auch weglassen, oder richtig benutzen: "os.path.abspath(os.path.join(...))"
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Sirius3: Danke für den Hinweis bezüglich der Path-Angabe. Wurde gleich umgesetzt.

Ich finde BlackJacks Variante auch wesentlich angenehmer, und übersichtlicher. Aber wenn ich seine anwende, dann werden die Icons nicht korrekt dargestellt. Auf meine Weise bekommen die Unterfenster ihre eigene Icons, und nicht die vom Hauptfenster.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Sophus:
Das bei Deiner von-Hand-Version die Icons funktionieren, ist ein undokumentiertes Verhalten der QMdiSubWindows (nur aus Quellcode ersichtlich):
- im Konstruktor wird das Icon vom parent geholt (wenn Du dort als parent self übergibst, gehts wieder nicht; die verkürzte Version von BlackJack hat als parent das MdiArea mit dem anderen Icon)
- in setWidget - wenn Icon leer ist (konnte keines im Konstruktor setzen), schau ob das Subwidget eines mitbringt und setze ggf. dieses

Das die Qt-Leute Letzteres implementiert haben, halte ich für problematisch, da nicht mehr konsistent im Verhalten und undokumentiert.

Heisst für die verkürzte Variante - Icon an QMdiSubWindow von Hand setzen (ungetestet):

Code: Alles auswählen

subwindow = mdiArea.addSubWindow(QWidget())
subwindow.setWindowIcon(QIcon())
subwindow.show()
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@jerch: Also, bei deiner Version, im Zusammenspiel von BlackJacks Version bedeutet das, dass ich beim erstellen des Fensters im gleichem Zuge die Icons mit übergeben muss? Wie du ja siehst, wickle ich das Setzen der Icons innerhalb der Search_Window-Klasse ab, sobald die Klasse instanziiert und geladen wird. Jetzt stehe ich zwischen zwei Stühlen. Nehme ich deine, und Blacks variante, dann muss ich schon in der Mdi_Main-Klasse die Icons setzen, sobald das Fenster von dort zentral erstellt wird, und bei mir ist zwar etwas umständlicher, jedoch wird das setzen der Icons innerhalb der Klasse abgewickelt. Was wäre die bessere Alternative? Ich frage euch deshalb, weil ihr Profis seid, und ich eure Meinungen und Hilfen wertschätze.
BlackJack

@Sophus: Setz es doch beim erstellen des `Search_Window`-Exemplars und frage das dann in dem Code der das erstellt ab und setze es auf dem `QMdiSubWindow`-Exemplar.

Edit: Eine total abgefahrene Idee wäre auch die Fenster die im MDI-Bereich angezeigt werden sollen einfach von `QMdiSubWindow` erben zu lassen…
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Sophus:
Hängt davon ab, was Du noch alles mit einem aktivierten Subwindow anstellen möchtest. Wenn ich die Screenshots sehe, vermute ich, dass sobald Funktionalität dazu kommt, Du Ableitungen von QMdiSubWindow für bestimmte Subwidgets brauchst (z.B. fürs Ändern der Menüeinträge, Ausgrauen von Einträgen etc.).

Apropos Funktionalität - mir scheint, Du beisst Dich sehr an der Präsentation fest. Hast Du Deinen MDI-Ansatz schonmal mit Anwendungsfällen/-logik gegengeprüft? So ein MDI ist nämlich eigentlich nur für eines ausgelegt - multiple Dokumentdarstellung mit ähnlichen Interaktionen. Zudem sind MDIs nicht pattformunabhängig - unter OSX und Gnome gibts die nicht (Qt emuliert das dort). Damit arbeitest Du aber gegen Benutzererfahrung. Generell wird heutzutage von MDI abgeraten.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@jerch: Was die Funktionalität betrifft, bin ich noch nicht weit genug. Ich beiße mich deshalb erst einmal an die Präsentation fest, weil ich natürlich lernen will :-) Aber zur allgemeinen Überlegung: Wie du gesehen hast, wird meine Anwendung eine reine Verwaltungsanwendung werden. Selbst in VB6 hat sich für mich das Arbeiten mit MDI bewährt. Denn ich will Filme, Bücher, Briefmarken, Videospiele, und was noch so bei mir im Haushalt anfällt verwalten können. Und bei dieser Vielzahl habe ich schon bei VB6 das SDI-Verfahren ausgeschlagen. Ich möchte nicht, dass man unendlich viele (Unter)Fenster auf dem Desktop herumschwirren hat. Sieht einfach (für mich) unordentlich aus. Dagegen ist im MDI alles "sauberer".
Antworten