QT findChild Problem
-
Habe mit QtCreator ein UI erstellt, direkt im MainWindow liegt ein GraphicsView in das gezeichnet werden soll.
QApplication a(argc, argv);
MainWindow w;QGraphicsView* view =w.findChild<QGraphicsView*>("graphicsView");
diese Anweisung funktioniert jedoch nicht
wenn diese Zeile einfachQGraphicsView* view = new GraphicsView;
ersetze erstellt er wunderbar ein neues Fenster, in das gezeichnet wird, wie es sein soll. wenn ich diese Zeile jedohc durch die obere ersetze startet das Programm erst gar nicht.
-
Das ist absolut viel zu wenig Information. Weder wie dein MainWindow aufgebaut ist, noch ob überhaupt ein QGraphicsView drinnen liegt, geschweige denn die Fehlermeldung, die du beim Start erhältst.
Ich denke aber dass du deinen ganzen Ansatz überdenken solltest. Das findChil() ist ganz nett, aber wenn es notwendig ist, von außen auf das graphicsView zuzugreifen, kannst du ganz einfach einen getter anbieten. Besser wäre es aber (wenn es geht) keinen direkten Zugriff auf das Objekt zu gewähren, sondern Methoden zum Verändern anzubieten.
Warum willst du denn unbedingt von außen Zugriff auf das graphicsView?
-
in dem MainWindows sind ein paar buttons/edits/etc und natürlich ein QGraphicsView mit dem namen graphicsView.
Sonst nichts.Erstellt mit QtCreator, der hat das irgendwie noch in ein "centralWidget" eingebettet.
Muss ich mir erst das holen, und davon dann wieder graphicsView?
Wie soll ich ein Getter genau anbieten, wie erreich ich das Objekt wenn das QGraphicsView ein einem Formular mittels QtCreator erstellt wurde? Das funktioniert ja irgendwie über resources oder so kP
-
gibt es noch andere Methoden als findChild um auf die Objekte mittels eines Designer erstellten Formulares zuzugreifen?
-
hab nochmal das problem minimiert:
#include <QtGui/QApplication> #include "mainwindow.h" #include "datablock.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; QGraphicsView& view = *qFindChild<QGraphicsView*>(&w, "graphicsView"); oder alternativ (klappt beides nicht) QGraphicsView& view = *w->findChild<QGraphicsView*>("graphicsView"); QGraphicsScene scene; scene.setSceneRect(0, 0, 200, 200); scene.addRect(5,5,10,10); view.setScene(&scene); view.show(); w.show(); return a.exec(); }
in w liegt das graphicsView object
Das Programm erscheint erst gar nicht ! ersetze ich view einfach durch ein neues QGraphicsView Objekt, erstellt er ein 2. Fenster und zeichnet darin wunderbar wie er soll:
... QGraphicsView view; QGraphicsScene scene; .... ... }
funktioniert!
-
Problem gelöst, ursache unbekannt, lösungsweg ebenfalls:D
-
asdasd schrieb:
Wie soll ich ein Getter genau anbieten, wie erreich ich das Objekt wenn das QGraphicsView ein einem Formular mittels QtCreator erstellt wurde? Das funktioniert ja irgendwie über resources oder so kP
Nix resources, uic erzeugt dir entsprechenden Code, aber wenn du qmake verwendest (und das .ui drinnen steht, was ich annehm) brauchst du dir da keinen Kopf machen.
Aber dir gehen wohl noch einige OOP und Qt-Grundlagen ab.
http://doc.qt.nokia.com/4.6/designer-using-a-ui-file.html
Da steht einiges.
Das graphicsView-Objekt erreichst du über das "ui"-Member deines MainWindow.Aber du willst doch nicht wirklich in der main deine scene aufsetzen? Für was hast du einen MainWindow-Konstruktor? Mach das doch da! Dann kannst du dir das öffentlichmachen des graphicsView sparen.