QPainter Fehler mit QDockWidget

Alles rund um die Programmierung mit Qt
m.mickey
Beiträge: 27
Registriert: 10. Januar 2010 23:01

QPainter Fehler mit QDockWidget

Beitrag von m.mickey »

Hallo.

Ich habe folgendes Problem:
Bisher war das Hauptfenster meiner Anwendung mit einem QWidget(QSplitter) in zwei Teile aufgeteilt und alles hat fehlerfrei funktioniert.
Nun möchte ich einen Teil in ein QDockWidget packen:

Code: Alles auswählen

  QDockWidget *ControlsDockWidget = new QDockWidget(tr("Controls"));
  ControlsDockWidget->setObjectName("ControlsDockWidget");
  ControlsDockWidget->setWidget(ControlFrame);
  ControlsDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
  ControlsDockWidget->setFeatures(QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
  addDockWidget(Qt::LeftDockWidgetArea, ControlsDockWidget);
Das funktioniert soweit auch, nur wenn ich das Dock dann entkopple und mit der Maus über die verschiedenen Teile fahre bekomme ich massenweise

Code: Alles auswählen

QPainter::pen: Painter not active
QPainter::setPen: Painter not active
QPainter::setOpacity: Painter not active
QPainter::drawPath: Painter not active
QPainter::setPen: Painter not active
QPainter::setOpacity: Painter not active
QPainter::setBrush: Painter not active
QPainter::setPen: Painter not active
QPainter::setOpacity: Painter not active
QPainter::setWorldTransform: Painter not active
QPainter::setOpacity: Painter not active
QPainter::restore: Unbalanced save/restore
QPainter::end: Painter not active, aborted
Außer den Warnungen funktioniert das Programm.
Wie gesagt, wenn das Dock angedockt ist kommen diese Warnungen nicht, wenn ich kein Dock habe sondern es als Widget im Splitter lasse kommen auch keine Warnungen.

Hat vielleicht jemand eine Idee, welches Problem hier vorliegt, bzw. was ich übersehen habe?

Viele Grüße mickey
m.mickey
Beiträge: 27
Registriert: 10. Januar 2010 23:01

Beitrag von m.mickey »

Ich hab noch vergessen:

Der Code zum Erstellen des DockWidgets steht im Constructor meines MainWindows.
Die QPainter Warnungen kommen z.B. wenn eine Scrollbar angezeigt oder ausgeblendet wird, wenn die Maus über einen Button oder über einen Splitter bewegt wird.

Viele Grüße mickey
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Etwas mehr Info wäre nicht schlecht. Z.B. welches Widget in dem Dock dann platziert wird. Ist da was eigenes dabei?
Spielst du irgendwo selber mit QPainter rum? Wenn ja -> Code!
Denn ich bezweifle, dass die Meldungen von Qt selber generiert werden, da ist eigentlich alles ordentlich entbuggt (naja :D Bugs gibts immer)
m.mickey
Beiträge: 27
Registriert: 10. Januar 2010 23:01

Beitrag von m.mickey »

Ich hab QPainter an anderen Stellen, aber auch wenn ich dir komplett auskommentiere kommen die Warnungen.

Der Inhalt des QDockWidget besteht aus Buttons, Slidern, Comoboxen, TabWidget, Labels... Es ist nichts "selbst gemaltes" drin, nur Widgets die aus den obigen Teilen zusammengesetzt sind; keine QPainter.

Viele Grüße mickey
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Dann zeig doch bitte entsprechenden Code, der bei dir die Meldungen produziert. Bitte minimal (keinen unnötigen Ballast) und fertig kompilierbar. Das sollte ja in einer einzigen main() machbar sein. Ich bin mir aber ziemlich sicher, dass das Problem dann futsch ist ;)
m.mickey
Beiträge: 27
Registriert: 10. Januar 2010 23:01

Beitrag von m.mickey »

Das ist ja mein Problem, ich weiß nicht welcher Code das Problem verursacht...
Ich bräuchte nen Hinweis, wie ich das rausfinde :oops:

Viele Grüße mickey
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Fang doch einfach damit an, dass du deinen Code zerlegst. mit einer vollkommen jungfräulichen main(). Dort legst du ein QMainWindow (noch nix abgeleitet) an. Dann packst du dein DockWidget mit den Widgets voll, die bei dir scheinbar das Problem verursachen. Wenn dann keine Meldungen mehr kommen, weißt du dass es an deinem Code liegt.

Dann kannst du hergehen und ein find auf deinen ProjectTree loslassen, um ALLE QPainter zu finden, die du irgendwo stehen hast. Wenn dir nicht klar ist, was daran dann dein problem auslöst, kannst du die Stellen ja posten.

Wenn du einfach nur hilflos bist, kannst du auch dein Projekt in ein .zip packen und das hier in deinen Post anhängen (BITTE nicht bei so nem werbeüberlasteten downloadportal ablegen, sondern hier im Forum die "Attachment"-Funktion unten nutzen, wenns zu groß wird einfach alle Binaries rauswerfen :P)
m.mickey
Beiträge: 27
Registriert: 10. Januar 2010 23:01

Beitrag von m.mickey »

Ich kenn mich in dem Code zwar einigermaßen aus, aber ich seh nicht wo das Problem sein soll.
Alle QPainter hatte ich schon auskommentiert, hat nichts geholfen. (HistogramWindow, ViewWindow, CurveWindow)

Der neue Abschnitt, der das Docking ermöglicht steht in Sources/dlMainWindow.cpp 83-90, sonst nichts. Die Warnungen kommen, wenn man das Dock entkoppelt und dann darin arbeitet.

Vielen Dank schon mal.

Der Code liegt hier: http://vorschau.mm-log.com/dlRaw.7z

Viele Grüße mickey
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich glaube ähnliche Warnungen habe ich heute auch bemerkt, Qt 4.6.2/openSUSE rpms. Bin mir ziemlich sicher dass es nichts mit deinem Programm zu tun hat.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
m.mickey
Beiträge: 27
Registriert: 10. Januar 2010 23:01

Beitrag von m.mickey »

Ich benutze qt 4.6.2 mit ubuntu lucid.

Ich habe das qt Beispiel für mainwindows/dockwidgets ausprobiert, damit bekomme ich die Warnungen nicht...

Hat vielleicht noch jemand ne Idee?

Viele Grüße mickey
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich habs jetzt endlich hinbekommen zu kompilieren :D
Die CMakeLists.txt brauchen noch etwas Liebe (es gibt ein FindImageMagick.cpp :P)
Starten tut es nicht, weil die lensfun-Db nicht geöffnet werden konnte. Vllt. kannst du mir kurz sagen, wie ich das zum Laufen bekomme.

Ansonsten:
*) Eher unwahrscheinlich, aber vllt. macht das Zeichnen im viewportEvent auf dem viewport() im dlViewWindow Probleme
*) Du setzt das MainWindow auf, dein ControlFrame liegt immer noch im Splitter, dann schiebst du das alles einfach ins DockWidget. Sollte aber eigentlich auch keine Probleme bereiten, außer du stellst dir irgendwo selber ein Bein...

Mein allerletzter Versuch: Probier mal nen anderen Style aus :/

Du kannst ja mal mit dem Debugger durchsteppen, und schauen ob du schlauer wirst.

// Edit: Ich bin hier unter Gentoo, da ist alles selber kompiliert, und bisher hab ich dahingehend noch keine Probleme feststellen können.
m.mickey
Beiträge: 27
Registriert: 10. Januar 2010 23:01

Beitrag von m.mickey »

Ich komiplier es zur Zeit nicht mit cmake (das muss mal überarbeitet werden, steht aber noch aus... ich bin später in das Projekt eingestiegen, daher liegt manches brach...) Wenn wir grad dabei sind, hast du evtl nen guten Link zum cmake lernen?

Ich nutze in einem frischen Verzeichnis (Makefiles gelöscht):
qmake
make
und dann in dem Verzeichnis ausführen, dann sollte es auch die Datenbank finden. Notfalls noch ~/.config/dlRaw löschen.

Danke für deine Vorschläge, ich werde sie heute Abend mal testen.

Viele Grüße mickey
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

m.mickey hat geschrieben:Ich nutze in einem frischen Verzeichnis (Makefiles gelöscht):
qmake
make

Code: Alles auswählen

/usr/bin/g++-4.3: No such file or directory
:evil: wer kommt auf die Idee, den Compiler hard zu codieren :evil:
Das war der Grund warum ich es mit CMake angegangen bin.
Aber jetzt schau ich mal mit qmake :)

Jo, jetzt läuft es.

und - tada - reproduziert! Es liegt an QtCurve!!!
Starte ich es mit Bespin oder Oxygen, kommen keine Warnings :)

Code: Alles auswählen

./dlRaw -style oxygen
m.mickey
Beiträge: 27
Registriert: 10. Januar 2010 23:01

Beitrag von m.mickey »

Danke Dir!

Diese Version kompiliert noch nicht mit gcc 4.4 (gcc 4.3 -> 4.4 hatte einige Änderungen), bei meiner aktuellen Version hier ist der Fehler längst behoben und gcc 4.4 geht problemlos...

Wenn ich den Style ändere kommen auch bei mir keine Meldungen mehr. Allerdings weiß ich nicht, wie ich den OxygenStyle direkt aus dem Code laden kann, ich finde in der Doku keinen QOxygenstyle :-(

Allerdings schaut es dann bei den anderen Styles nach einem Bug aus :-( Gibt es eine Möglichkeit gezielt nur diese Fehlermeldungen abzuschalten?

Viele Grüße mickey
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Code: Alles auswählen

QApplication::setStyle("oxygen");
Vllt. testen, welche Styles Probleme machen, welche Styles gehen, und entsprechend die QStyleFactory::keys() filtern.

Wg. compiler-Fehlern: Die schlimmsten kommen von deprecated Code ;)
stdlib.h -> cstdlib heißt das schon länger.
usw.

K.A. ob das wirklich Bugs sind, oder ob euer Code das Verhalten provoziert.
Viele Styles verwenden eigene Hacks, um spezille Widget anders zu gestalten. K.A. was da die Meldungen auslöst. Du kannst ja mal CraigD fragen, ob dir der da weiter helfen kann.
Antworten