Anzeige:
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 15 von 31

Thema: [Qt] Probleme mit QCanvas

  1. #1
    Registrierter Benutzer
    Registriert seit
    20.02.2004
    Beiträge
    15

    [Qt] Probleme mit QCanvas

    Moin.

    ich soll mich fuer ein Schulreferat in Qt einarbeiten. Die Aufgabenstellung ist aber ziemlich umfangreich.

    Es soll ein Feld geben, in das man Punkte zeichnen kann und die danach durch Linien zu einem Graphen verbunden werden.

    Ich hab die GUI jetzt relativ weit mit dem Designer gemacht, aber finde nirgends ein QCanvas zum Draufklicken und auf den Dialog platzieren. Und das Ganze manuell irgendwie zu integrieren krieg ich auch nicht hin.

    Zu meinem Wissensstand: Ich hab das erste Tutorial zur Haelfte durchgearbeitet und dann noch das QuickTut zum Designer, also ich bin noch nicht sooo weit, aber naja, ich muss es halt irgendwie hinkriegen und hab keine Zeit fuer ein ewiges Trial&Error.

    Danke schonmal im Vorraus.

    //edit: Haette auch nix gegen nen ICQ-Query
    Geändert von Flying_Eagle (20-02-2004 um 23:47 Uhr)

  2. #2
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    hi,

    im designer ist im default keine möglichkeit, ein QCanvasView zu erzeugen. in einem alten Qt buch habe ich ein beispiel gefunden, was deinem problem sehr ähnelt.

    ich habe es dir mal als tarball hochgeladen:
    http://www.tuxipuxi.de/canvas.tar.bz2

    einfach
    qmake && make ausführen und mit ./canvas2 starten.

    gruss,
    michael.

    p.s: ist natürlich nicht genau das gleiche, aber sehr ähnlich.

  3. #3
    Registrierter Benutzer
    Registriert seit
    20.02.2004
    Beiträge
    15
    Vielen Dank. Das kann ich glaub ich gut gebrauchen. Versuchen das in mein Projekt einzubinden werde ich aber erst morgen, wenn ich ausgeschlafen bin.

    Nur noch ne kurze Frage: Ist das QCanvasView notwendig, damit man ueberhaupt was von dem Canvas sehen kann? Ich hab es bis jetzt immer nur mit nem Canvas und ner CanvasLine probiert...

  4. #4
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    Original geschrieben von Flying_Eagle
    Vielen Dank. Das kann ich glaub ich gut gebrauchen. Versuchen das in mein Projekt einzubinden werde ich aber erst morgen, wenn ich ausgeschlafen bin.

    Nur noch ne kurze Frage: Ist das QCanvasView notwendig, damit man ueberhaupt was von dem Canvas sehen kann? Ich hab es bis jetzt immer nur mit nem Canvas und ner CanvasLine probiert...
    hi,

    ja, weil ein QCanvas keine von QWidget abgeleitete klasse ist. der QCanvasView hat den Canvas als child und stellt ihn dar.

    gruss,
    michael.

  5. #5
    Registrierter Benutzer
    Registriert seit
    08.07.2002
    Beiträge
    719
    Auf was für eine Schule gehst du denn und in was für einer Jahrgangsstufe darf man so was machen?

  6. #6
    Registrierter Benutzer
    Registriert seit
    20.02.2004
    Beiträge
    15
    Gymnasium und 12. Klasse.
    Da wir bis jetzt grafische Oberflaechen nur mit Delphi erstellt haben, koennt ihr euch ungefaehr vorstellen, wie ueberfordert ich bin...

    Ich hab jetzt mal versucht das Beispielprogramm in eine HBox zu integrieren, um dem Ganzen eine Form gebe zu koennen, aber dann wird dir Flaeche nicht angezeigt.

    Ich den Kram mal an, waere nett, wenn mir da jemand raushelfen koennte, da ich das Referat morgen halte, allerdings muss ich das im Notfall nicht haben.


    //edit: Ich hab das vorerst entscheidende markiert...

  7. #7
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    hi,
    funktionierende version:
    http://www.tuxipuxi.de/main.cpp
    (erklärung folgt gleich, dachte ich lade das schnell hoch, weil du es bald haben musst).

    ok, da wo ich was geändert hab, habe ich das durch einen kommentar signalisiert.

    line-by-line:

    Code:
        QCanvas canvas(this, "flaeche");
        canvas.resize(100, 100);
        Zeichenflaeche z(canvas);
        z.show();
    du erstellst die objekte auf dem stack und dadurch sind sie nur solange existent, bis der konstruktor durchlaufen ist und du siehst den canvasview danach nicht mehr. deswegen habe ich das in folgendes geändert:

    Code:
        QCanvas *canvas = new QCanvas(this, "flaeche"); //auf heap, weil sonst weg nach konstruktor
        canvas->resize(100, 100); //-> weil pointer
        Zeichenflaeche *z = new Zeichenflaeche(canvas, this); //auf heap, weil sonst weg nach konstruktor
    beide objekte auf dem heap, -> statt . weil ich auf einem pointer operiere.
    das show() kannst du weglassen, wenn du widgets innerhalb von widget subclasses instanziierst, weil das Qt automatisch anzeigt.

    die restlichen änderungen habe ich nur vorgenommen, weil dein code nicht auf den pointer "eingestellt" war, sind also keine wirklichen codeänderungen.

    tu mir bitte den gefallen und sag deinem lehrer von mir, dass man code und seine kommentare auf englisch schreibt, klassennamen wie "Zeichenflaeche" haben da nichts zu suchen.

    gruss,
    michael.
    Geändert von tuxipuxi (22-02-2004 um 19:27 Uhr)

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Wenn du Canvas und View im Box Widget erzeugst, musst du die Instanzen am Heap erzeugen, weil sie sonst am Ende des Konstruktors ihre Gültigkeit verlieren

    Code:
    Komposition::Komposition(QWidget *parent, const char *name)
            : QVBox(parent, name)
    {
        QFont ueberschrift("Times", 16);
    
        QLabel *hello = new QLabel("Hallo", this, "hello");
        hello->setFont(ueberschrift);
        hello->show();
    
    
    //=========================================
        QCanvas* canvas = new QCanvas(this, "flaeche");
        canvas->resize(100, 100);
        Zeichenflaeche* z = new Zeichenflaeche(canvas, this);
        z->show();
    //==========================================
    
        QPushButton *quit = new QPushButton("Tschuess", this, "quit");
        connect(quit, SIGNAL(clicked()), qApp, SLOT(quit()));
    Den Konstruktor von Zeichenfklaeche natürlich noch so anpassen, dass er als erstes Argument QCanvas* hat statt QCanvas&

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer
    Registriert seit
    20.02.2004
    Beiträge
    15
    Vielen, vielen Dank!!!
    Jetzt muss ich nur noch den Code vereinfachen, damit ihn auch die anderen verstehen. Auf den Rest, wie z.B. die gewueschte Datenbankanbindung verzichte einfach mal.


    Wie lange habt ihr denn so gebraucht bis ihr die Programmierbasics drauf hattet? Also z.B., dass man manche Sachen eben mit Argumenten wie (canvas, this) aufrufen muss? Ich hab hier das Wort heap das erste Mal gehoert.

  10. #10
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    wie lange man braucht um sowas zu wissen hängt natürlich von den vorkenntnissen und der intensität des lernens ab. ich beschäftige mich mit Qt seit einiger zeit zum spass, anda_skoa ist seit längerer zeit softwareentwickler und arbeitet auch in der firma mit Qt.

    das mit this fällt einem sofort auf, wenn man weiss, wie das parent modell in Qt gedacht ist. ein nicht-top-level-widget hat ein parent widget, in dem es angezeigt wird. das fällt natürlich schnell auf, wenn man weiss, wo das problem ist. (edit: das parent modell hat nicht nur was mit widgets zu tun, auch nicht-graphical-control klassen wie QProcess haben ein parent.)

    gruss,
    michael.
    Geändert von tuxipuxi (22-02-2004 um 20:18 Uhr)

  11. #11
    Registrierter Benutzer
    Registriert seit
    20.02.2004
    Beiträge
    15
    Gut. Ich hab mein Referat jetzt gehalten. Habe aber weiterhin den Auftrag dieses Programm zu schreiben.
    Da muss ich Pixel auf dem Canvas anklicken koennen. Wo soll ich da ansetzen. Weder beim QCanvas noch beim QCanvasView habe ich ne Funktion gefunden, die mir was ueber nen Mausklick in dem Feld berichtet

  12. #12
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    hi,

    QCanvasView erbt von QWidget und hat daher einen mousePressEvent event handler, den man reimplementieren kann, wenn man QCanvasView wiederum subclassed. was sollst du denn genau machen?

    gruss,
    michael.

    p.s: freu dich, dass du das machen darfst.. ich werde mit delphi gelangweilt von einem lehrer, der nichtmal das kann.

  13. #13
    Registrierter Benutzer
    Registriert seit
    20.02.2004
    Beiträge
    15
    Original geschrieben von tuxipuxi
    hi,

    QCanvasView erbt von QWidget und hat daher einen mousePressEvent event handler, den man reimplementieren kann, wenn man QCanvasView wiederum subclassed. was sollst du denn genau machen?
    Wir behandeln momentan Graphen, also diese Dinger, wo jeder Knoten mit jedem verbunden ist und jetzt soll ein Programm geschrieben werden, das schoen anschaulich das Travelling-Salesman-Problem loest.
    Dazu soll ich das GUI machen.
    D.h. es gibt ein Canvasfeld auf dem man durch Mausklick Punkte auswaehlen kann. Hat man das getan, kann man sie verbinden und die Koordinaten in einer Datenbank abspeichern.

    Den Loesungsalgorithmus entwickeln wir dann mit Hilfe des Lehrers.



    p.s: freu dich, dass du das machen darfst.. ich werde mit delphi gelangweilt von einem lehrer, der nichtmal das kann.
    Ich find auch cool, dass wir solche Sachen machen. Delphi hat mich immer gestresst, da es sehr empfindlich auf schlecht konfigurierte Schulsysteme reagiert und abzustuerzen pflegt bzw. komische Sachen tut.

    Mein Problem bei der Sache ist, dass ich gar nicht weiss, wo ich mit dem Lernen anfangen soll. Bis jetzt haben wir in C++ nur die wichtigsten Basics von Kopien abgeschrieben (naja, ich hab zuhause wenigstens noch ein bisschen rumexperimentiert), aber ausserhalb der Schule hab ich sonst quasi gar nicht Programmiert, mehr so Anwendungskram gemacht.

    Aber wenn ich das Projekt zuende gebracht habe, kann ich denke ich auch andere Sachen machen und vielleicht auch produktive Programme schreiben.


    //edit: Ich Esel! Das mit dem MousePressEvent kann man ja auch in dem Beispiel sehen...
    Geändert von Flying_Eagle (23-02-2004 um 17:12 Uhr)

  14. #14
    Registrierter Benutzer Avatar von tuxipuxi
    Registriert seit
    30.08.2002
    Beiträge
    667
    Hi,

    ein weiteres, ähnliches QCanvas Beispiel findest du im Qt Examples Ordner in demo. Ein QCanvas Beispiel gibt es auch noch in canvas.
    Arbeitet ihr eigentlich unter Linux oder mit Windows?


    Gruss,
    Michael.

  15. #15
    Registrierter Benutzer
    Registriert seit
    20.02.2004
    Beiträge
    15
    Leider nur mit Windows fuer das es ja nur ne Evaluation-Lizenz gibt, wobei wir vielleicht auch ne Educational bekommen.
    Hier zuhause nem ich Linux...

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •