QGraphicsScene, QGraphicsView, QGraphicsItem, Hilfe?
Verfasst: 2. März 2010 19:59
Hallo,
Ich versuche mich jetzt schon seit 5 Tagen durch QGraphicsScene und QGraphicsView durchzubeißen, aber ich schaffe es nicht. Auch die Hier im Forum zu diesen Themen veröffentlichten Beiträge bzw. die in Qt mitgelieferten Beispiele lieferten den gewünschten AHA Effekt. Zudem muss ich sagen, dass ich ein Neuling in Qt/C++ bin, jedoch meine Studienarbeit darin machen muss (und OOOH, ich hab nur noch 3 wochen Zeit).
Was ich möchte:
Ich möchte ein Programm schreiben, in dem ich 1 Objekt (einen Pfeil) habe.
Dieser Pfeil soll ich in der Mitte des Bildschirmes Drehen, der Pfeil soll an einem der Vier Himmelsrichtungen Stehen bleiben und dann sofort verschwinden. Die Zeit des Drehens ist randomisiert. der Benutzer soll nun die Pfeiltaste drücken in welche der Pfeil zuletzt gezeigt hat. War dies Richtig, so soll der Pfeil erneut auftauchen, ansonsten das Programm beenden (eigentlich so nicht, aber zum Verständinis würde es reichen.
Was ich bisher verstehe:
Ich will das Ganze als Widget bauen, auch wenn es später im Vollbildmodus laufen soll. Ergo nehme ich mir eine neue Klasse Graphic mit graphic.h und graphic.cpp. Diese sähen dann folgendermaßen aus:
graphic.h
graphic.cpp
und wenn ich dann in der main.cpp das ganze Aufrufe
dann bekomme ich mein Fenster mit meinem Pfeil. Ich weiss, dass es Timer gibt, und dass ich diesen via Signal/Slot mit einem slot in der Graphic-Klasse verbinden kann, um dann in regelmäßigen Abständen die Scene zu verändern.
Allerdings habe ich es noch nicht erfolgreich geschafft eine solche Verbindung inklusive Slot zu erstellen.
Das nächste Problem ist genau dieser Slot, was ja nichts anderes ist, als eine Funktion.
hier müsste ich nun auf die eingebundene Pixmap zugreifen, nur habe ich keine ahnung, wo ich die Referenz darauf hernehmen soll. Des Weiteren müsste ich die Grafik dann entsprechend drehen. Wäre es vielleicht sinnvoller die Grafik als ein QGraphicsItem (qgi) einzubinden, da diese die Methoden "rotate" und "setPos" besitzt. Nur wie binde ich dann hier die Grafik ein?
Zum Schluss müsste man dann hier
ausführen?
Soweit erst einmal dazu. Ich hoffe ein Sachverständiger kann mir hier weiterhelfen, denn ich geh an dem Zeitdruck fast zu grunde (ich versuche mich schon seit 3 Wochen in das Thema (Grafk in Qt, erst QPainter und nachdem ich bemerkt habe, dass es nicht das ist was ich brauche, nun dieses) einzulesen, aber umsomehr ich lese, umso weniger glaube ich, dass ich das noch verstehe). Ich habe mir das aktuelle Buch zu Qt von GallileoComputing geholt, gut geschrieben, aber leider ist genau dieses Thema nicht dabei. Und ich habe dazu auch kein einfaches, verständliches Tutorial gefunden.
Liebe Grüße und völlig verzweifelt
Torsten
Ich versuche mich jetzt schon seit 5 Tagen durch QGraphicsScene und QGraphicsView durchzubeißen, aber ich schaffe es nicht. Auch die Hier im Forum zu diesen Themen veröffentlichten Beiträge bzw. die in Qt mitgelieferten Beispiele lieferten den gewünschten AHA Effekt. Zudem muss ich sagen, dass ich ein Neuling in Qt/C++ bin, jedoch meine Studienarbeit darin machen muss (und OOOH, ich hab nur noch 3 wochen Zeit).
Was ich möchte:
Ich möchte ein Programm schreiben, in dem ich 1 Objekt (einen Pfeil) habe.
Dieser Pfeil soll ich in der Mitte des Bildschirmes Drehen, der Pfeil soll an einem der Vier Himmelsrichtungen Stehen bleiben und dann sofort verschwinden. Die Zeit des Drehens ist randomisiert. der Benutzer soll nun die Pfeiltaste drücken in welche der Pfeil zuletzt gezeigt hat. War dies Richtig, so soll der Pfeil erneut auftauchen, ansonsten das Programm beenden (eigentlich so nicht, aber zum Verständinis würde es reichen.
Was ich bisher verstehe:
Ich will das Ganze als Widget bauen, auch wenn es später im Vollbildmodus laufen soll. Ergo nehme ich mir eine neue Klasse Graphic mit graphic.h und graphic.cpp. Diese sähen dann folgendermaßen aus:
graphic.h
Code: Alles auswählen
#ifndef GRAPHIC_H
#define GRAPHIC_H
#include <QGraphicsView>
#include <QGraphicsScene>
class Graphic : public QGraphicsView
{
public:
Graphic();
private
QGraphicsScene *scene; // die Scene
QGraphicsView *view; // die dazugehoerige View
void keyPressEvent(QKeyEvent *event); // die Reimplementierung von keyPressEvent
};
#endif // GRAPHIC_H
Code: Alles auswählen
#include "graphic.h"
#include <QGraphicsView> // Frage: Muss ich auf diese erneut Verweisen, wenn ich es in "graphic.h" bereits getan habe?
#include <QGraphicsScene> // gleiche Frage
#include <QtGui>
Graphic::Graphic()
{
scene = new QGraphicsScene;
scene->addPixmap(QPixmap(":/images/pfeil_gruen.svg")); // in Resourcendatei angelegt; Frage: wie nutze ich Aliasnamen? mit :Aliasname ??
view = new QGraphicsView(scene,this); // die View ist mein "Betrachtungsfenster, mit der ich meine Scene betrachte, richtig??
view.resize(400,400); // setzt die Größe der View, nicht des Fensters
view.show();
}
void Graphic::keyPressEvent(QKeyEvent *event)
{
if (event->key() == Qt::Key_Escape) // ist erstmal eine simple Exitstrategie
{
QApplication::quit();
}
}
Code: Alles auswählen
#include <QtGui/QApplication>
#include <QWidget>
#include "graphic.h"
int main( int argc, char* argv[] ) {
QApplication app( argc, argv );
Graphic *w = new Graphic;
w->show();
return app.exec();
}
Allerdings habe ich es noch nicht erfolgreich geschafft eine solche Verbindung inklusive Slot zu erstellen.
Das nächste Problem ist genau dieser Slot, was ja nichts anderes ist, als eine Funktion.
Code: Alles auswählen
Graphic::animiere()
{
}
Zum Schluss müsste man dann hier
Code: Alles auswählen
scene.update(qgi);
Soweit erst einmal dazu. Ich hoffe ein Sachverständiger kann mir hier weiterhelfen, denn ich geh an dem Zeitdruck fast zu grunde (ich versuche mich schon seit 3 Wochen in das Thema (Grafk in Qt, erst QPainter und nachdem ich bemerkt habe, dass es nicht das ist was ich brauche, nun dieses) einzulesen, aber umsomehr ich lese, umso weniger glaube ich, dass ich das noch verstehe). Ich habe mir das aktuelle Buch zu Qt von GallileoComputing geholt, gut geschrieben, aber leider ist genau dieses Thema nicht dabei. Und ich habe dazu auch kein einfaches, verständliches Tutorial gefunden.
Liebe Grüße und völlig verzweifelt
Torsten