Qt Creator & QGraphicsScene

Alles rund um die Programmierung mit Qt
Antworten
jaronimo
Beiträge: 13
Registriert: 29. April 2010 19:00

Qt Creator & QGraphicsScene

Beitrag von jaronimo »

Hallo alle zusammen!

Ich bin ein ziemlicher Qt Neuling und tüftle schon den ganzen Tag an einem Problem

Ich habe mit Qt Creator ein simples GUI erstellt mit einem QGraphicsView.
Ich würde in diesen GraphicsView gern eine QGraphicsScene integrieren, um darin einen Graph zeichnen zu können.

Ich bekomme es aber einfach nicht hin die GraphicsScene in den GraphicsView einzufügen bzw den GraphicsView zu manipulieren.

Der View wird automatisch vom Qt Creator ins Layout eingebunden, das passiert alles im generierten ui_mainwindow.h, in dem ich ja nichts ändern sollte.

Wenn ich jetzt in meinem Code im mainwindow.cpp im Constructor zB
ui->graphicsView->setBackgroundBrushQColor(0, 0, 0)); schreibe, bleibt der View trotzdem weiss.

auch weiss ich nicht wie ich die Scene zum View hinzufügen soll. Im Colliding Mice Beispiel wurde kein .ui file verwendet und deshalb die Szene gleich im Constructor an den View übergeben. Wie soll ich die Szene übergeben wenn der View Constructor schon im generierten ui_.h aufgerufen wird? Ich will die Szene so übergeben, dass sie in dem "StreamGraph" betitelten View angezeigt wird..

Ich habe den View im Designer wieder rausgelöscht und dann versucht, ihn manuell hinzuzufügen - inklusive Szene im Constructor, aber dann wurde mir nicht mal ein weisser View im Layout angezeigt..

bin also völlig ratlos, wie das nun richtig angestellt wird.
Bitte dringend um Hilfe,
lg

PS: hier mein mainwindow.cpp constructor: (habe zum testen die colliding mice scene verwendet)

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);

   QGraphicsScene scene;
   scene.setSceneRect(-300, -300, 600, 600);
   scene.setItemIndexMethod(QGraphicsScene::NoIndex);
   for (int i = 0; i < 7; ++i) {
       Mouse *mouse = new Mouse;
       mouse->setPos(::sin((i * 6.28) / 7) * 200,
                     ::cos((i * 6.28) / 7) * 200);
       scene.addItem(mouse);
   }
   ui->graphicsView->setBackgroundBrush(QColor(0, 0, 0));  //tut nichts
}
EDIT: ich weiss dass "scene" im moment nicht verwendet wird, weil ich eben nicht weiss, wie ich sie einbinden soll..
Dateianhänge
Untitled.png
Untitled.png (58.53 KiB) 4132 mal betrachtet
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

1) QGraphicsView::setBackgroundBrush() funktioniert schon, macht aber erst was wenn du deiner view eine scene gibst.
2) So schwierig ist das jetzt doch nicht mit dem scene setzen, oder?
Wenn du auf "ui->graphicsView->setBackgroundBrush()" gekommen bist, kannst du doch auch auf "ui->graphicsView->setScene(scene)" kommen :P

BTW: In deinem Codeausschnitt wirst du aber in ein kleines Problem rennen. scene liegt bei dir im automatischen Speicherbereich, sprich das Objekt wird nach Verlassen des Scopes in dem es liegt gelöscht. Sprich: nach dem Konstruktor existiert das Ding nimmer ;)
Mach einfach einen Member deines MainWindow draus, du wirst die scene eh auch aus anderen Methoden heraus brauchen. Geht zwar auch über "ui->graphicsView->scene()", aber die zusätzlichen Indirektionen kannst du dir ja auch sparen :)
jaronimo
Beiträge: 13
Registriert: 29. April 2010 19:00

Beitrag von jaronimo »

danke für die antwort!

dass ich view->setScene() übersehen habe, hab ich der autovervollständigung zu verdanken ;) ..hat nix mehr angezeigt wenn ich ->sets geschrieben hab...

bin aber inzwischen auf den qpainter umgestiegen, da er für meine zwecke wahrscheinlich nützlicher ist.

aus irgendeinem grund bekomm ich aber nix gezeichnet. es muss an der art liegen wie ich das mainwindow initialisiere, da ich das widget schon in einem demoframework getestet hab..

Code: Alles auswählen

#include "mainwindow.h"


mainwindow::mainwindow(QWidget *parent) :
    QMainWindow(parent)
{

    //resize(640, 480);

    renderArea = new streamWidget;

    layout = new QHBoxLayout;
    layout->addWidget(renderArea);

    setLayout(layout);
    setWindowTitle("StreamGraphs10");
}

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtGui>
#include "streamWidget.h"


class mainwindow : public QMainWindow
{
Q_OBJECT
public:
    explicit mainwindow(QWidget *parent = 0);

private:
    streamWidget *renderArea;
    QHBoxLayout *layout;
signals:

public slots:

private slots:


};

#endif // MAINWINDOW_H
das sollte doch stimmen oder?
mir wird aber nix angezeigt...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

jaronimo hat geschrieben:das sollte doch stimmen oder?
Nein, das stimmt leider nicht. Und wenn du das Programm auf ner konsole startest, weißt du warum. QMainWindow erlaubt kein "setLayout". QMainWindow hat sein eigenes Layout für die ganzen Sachen wie DockWidgets, Menu, Toolbars usw. Was du suchst ist "setCentralWidget"
jaronimo
Beiträge: 13
Registriert: 29. April 2010 19:00

Beitrag von jaronimo »

in der tat. danke für den hinweis!

wenn ich das jetzt richtig verstanden hab dann muss ich, wenn ich ein layout ins mainwindow bringen will
*) ein leeres widget centralwidget erstellen
*) danach ein layout, das das centralwidget als parent hat
*) dann mainwindow->setcentralwidget(centralwidget)
bzw

Code: Alles auswählen

centralWidget = new QWidget(MainWindow);
groupBox = new QGroupBox(centralWidget);
verticalLayoutWidget = new QWidget(groupBox);
graphLayout = new QVBoxLayout(verticalLayoutWidget);
graphLayout->addWidget(renderArea);
MainWindow->setCentralWidget(centralWidget);
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Im Prinzip, ja. Wobei bei dir die GroupBox irgendwie in der Luft hängt ;) Geh mal durch und finde das Layout, in dem die steckt.
Im Prinzip hätte folgendes gereicht, wenn du uns nicht noch mehr Widgets verschwiegen hast ;)

Code: Alles auswählen

renderArea = new RenderArea( MainWindow);
MainWindow->setCentralWidget(renderArea);
Außerdem sollte doch das MainWindow sein centralWidget selber setzen (normalerweise), da dieses mit den toolButtons, menus usw. interagiert. Dann müsstest du ja alle Member als public exponieren, wenn du alles von außen machen wolltest, und das ist nicht schön ;)
Außerdem wird die main() ziemlich überladen.
jaronimo
Beiträge: 13
Registriert: 29. April 2010 19:00

Beitrag von jaronimo »

sehr gut, das funktioniert jetzt mal problemlos. danke nochmal!

hab aber schon wieder eine neue frage, die ich mal hier rein poste obwohl sie nicht ganz zum thema passt:

ich zeichne jetzt ein polygon, das meine werte umrandet (siehe screenshot), würde aber lieber smoothe interpolation, also keine spitzen sondern kurven haben. ähnlich wie bei Catmull–Rom splines.

gibt es in qt eine möglichkeit die splines zu berechnen, oder muss ich mir jeden interpolierten punkt selbst berechnen?
bei qpainterpath gibt es ja cubic splines aber die brauchen kontrollpunkte..
Dateianhänge
graph.png
graph.png (72.62 KiB) 4093 mal betrachtet
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Das darfst du selbst berechnen...
Antworten