show() und hide() sehr langsam

Alles rund um die Programmierung mit Qt
Antworten
benicz
Beiträge: 12
Registriert: 24. Juni 2010 17:18

show() und hide() sehr langsam

Beitrag von benicz »

hallo zusammen!
ich habe ja viel darüber gefunden, wie man ein zweites fenster 1. überhaupt anzeigt und 2. per pushbutton, aber mein problem ist spezieller:

ich habe ein hauptfenster ("ganz normales" mainwindow). darauf ist ein menubutton, der ein zweites fenster öffnet, auf dem zur laufzeit, je nach menüposition, weitere buttons erzeugt und destroyed werden. grundsätzlich funktioniert das auch prima.
aber:
nach dem klick auf den button vergehen gut und gerne ein-zwei sekunden, bis das neue fenster angezeigt wird!

details:
1. das hauptfenster hat keinen rand und wird mit showfullscreen geöffnet, da es die gesamte oberfläche einnehmen soll. (brauche platz und die plattform (hier win7x64) soll nicht erkennbar sein)
2. das zweite fenster ist ein per assistent erstelltes weiteres fenster (erbt von qwidget), dessen größe der des hauptfensters gleichgesetzt wird.
3. ich nutze qss für ein eigenes erscheinungsbild der buttons usw.

verdacht:
1. der ja bildfüllende hintergrund des zweitfensters ist leicht transparent und ist aufwändig zu rendern
2. im zweitfenster nutze ich einige geschachtelte layouts, um die menüpunkte automatisch zu zentrieren. jenachdem wie die intern gestrickt sind (rekursion?), ist sowas ja durchaus rechenintensiv.
3. das erzeugen der buttons und deren eintragung in eine qlist dauert lange.

komisch:
1. ich arbeite auf einem hp touchsmart tm2, der ohne mecker auf zwei bildschirmen "aero" macht, da kann es doch an der rechenleistung nicht liegen, oder?!
2. ein button in diesem menü bewirkt natürlich das beenden des programms, was auch brav unmittelbar nach dem loslassen der maustaste geschieht.


werde gleich noch code posten, aber ob der was erklärt? wollen wir's hoffen! ;-)

schonmal danke für eure hirnwindungen!
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Re: show() und hide() sehr langsam

Beitrag von macman »

benicz hat geschrieben:1. ich arbeite auf einem hp touchsmart tm2, der ohne mecker auf zwei bildschirmen "aero" macht, da kann es doch an der rechenleistung nicht liegen, oder?!
Doch, Win7 nutzt die Grafikkarte für Aero. Wenn die es nicht kann, kann der Rechner noch so schnell sein. Wenn Qt die Transparenzen selber rechnet, dann kann das schon dauern.

Um den Flaschenhals zu finden, kann debuggen nicht schaden. Einfach an verdächtigen Stellen einen Breakpoint setzen und durchsteppen. Wenn irgendwo eine Gedenkpause zu bemerken ist, dann solltest du dir die Stelle genauer ansehen.
Die deutsche Schriftsprache ist case-sensitive. Außerdem gibt es eine Interpunktionsnorm. Wenn manch einer seine Programme genauso schlampig schreibt, wie sein Posting hier, dann sollte er es lieber bleiben lassen.
benicz
Beiträge: 12
Registriert: 24. Juni 2010 17:18

Beitrag von benicz »

morgen zusammen!

sorry, zum code bin ich nicht mehr gekommen... :oops:

aber gesagt getan: auch ohne tranzparenz wird stark verzögert angezeigt.
und: wenn ich (egal ob per menu, alt-F4 oder debugger) das programm schließe, erscheint sofort, ohne verzögerung, der desktop (oder was auch immer "dahinter" lag).
grafikmäßig bleibt also eigentlich nurnoch die frage, ob layouts und qss-styles das zeichnen verlangsamen.

übrigens:
das programm "navigon fresh" (vielleicht kennt's ja jemand) ist auch in qt geschrieben. da passiert genau, was ich möchte:
wenn man irgendwo draufklickt, wo erstmal gewartet werden muss, verblasst das hauptfenster, und ein zentrierter fortschrittsbalken verrät wie lange man noch warten muss.
anstelle des progressbar brauche ich halt vertikal gestapelte buttons.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

benicz hat geschrieben:sorry, zum code bin ich nicht mehr gekommen... :oops:
Code ist eigentlich das Einzige, was hilft. Man kann viel falsch machen...

Ansonsten:
zu details:
1) garantiert nicht problematisch
2) sollte auch egal sein, wobei ein Blick in Richtung QMainWindow::setCentralWidget bzw QStackedWidget lohnenswert ist.
3) hier kann ich mir am ehesten Perfomanceprobleme vorstellen: StyleSheets sind laaaangsam! Es ist halt schön und easy zu verwenden...
Nimm die mal testweise komplett raus und schau obs besser wird.

zu verdacht:
1) Wenn Grafikkarte und -treiber halbwegs aktuell sind, sollte das keine Probleme bereiten. Im Gegenteil, Bei Transparenz wird relativ sicher die Grafikkarte mit OpenGL bedient, was schneller sein sollte, als alles den Prozessor machen zu lassen.
2) Nein, Layouts sollten auch kein Problem sein. Pack doch mal zum Testen komplexere Layouts in zwei Widgets und setze die in einen QSplitter, und verschieb dann den Splitter. Das sollte annähernd ohne Verzögerung die Layouts vergrößern/verkleinern.
3) äh... Du steckst da nur einen Pointer in eine Liste, dabei wird eine neue ListNode erzeugt, ein paar Zeiger gesetzt, fertig. Eine Fläche von 10x10 Pixel zu rendern wird deutlich länger dauern :D

Wenn details::3 nicht hilft musst du Code posten.
benicz
Beiträge: 12
Registriert: 24. Juni 2010 17:18

Beitrag von benicz »

ok, ::3 werde ich dann mal versuchen!
hoffentlich gibt es eine einigermaßen "einfache" alternative zu qss... :oops:
wenn auch das nicht hilft, poste ich code- versprochen!! :wink:
danke euch!

edit:
tja, die stylesheets waren's, mist :-(
dann suche ich mal nen anderen weg...
Antworten