Seite 1 von 1

QImage neu erstellen und mit QScrollArea ausgeben

Verfasst: 1. Mai 2009 09:35
von wlas
Ich kämpfe schon seit Tagen an einer einfachen Aufgabe: Ich wollte ein Diagramm in einem neu erstellten QImage ausgeben und über QScrollArea auf dem GUI präsentieren. Deswegen habe ich eine eigene Klasse vom QScrollArea abgeleitet, ein QImage platziert und probe-weise versuche ich etwas dort mit Hilfe vom paintEvent zu zeichnen:

Header:

Code: Alles auswählen

#ifndef FLOW_GRAPH_H
#define FLOW_GRAPH_H

#include <QImage>
#include <QLabel>
#include <QPainter>
#include <QScrollArea>


class FlowGraph : public QScrollArea
{
    public:
        FlowGraph();
        QImage  image;
        QLabel  *imageLabel;

    protected:
        void paintEvent(QPaintEvent *event);

};

#endif // FLOW_GRAPH_H
Klasse:

Code: Alles auswählen

#include "flow_graph.h"

FlowGraph::FlowGraph()
{
    imageLabel = new QLabel;
    imageLabel->setBackgroundRole(QPalette::Base);
    imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    imageLabel->setScaledContents(true);

    this->setBackgroundRole(QPalette::Dark);
    this->setWidget(imageLabel);

    image = QImage(800, 200, QImage::Format_RGB32);
    image.fill(0);
    
    imageLabel->setPixmap(QPixmap::fromImage(image));
    imageLabel->adjustSize();
}



void FlowGraph::paintEvent ( QPaintEvent * event )
{
   QPainter painter(this);

   painter.setPen(QPen(Qt::white,12,Qt::DashDotLine, Qt::RoundCap));
   painter.setBrush(QBrush(Qt::green,Qt::SolidPattern));
   painter.drawEllipse(80,80,400,240);

   painter.drawImage(0, 0, image );

}
Doch als Ergebnis bekomme ich nur ein schwarzes Bild und viele Fehler-Meldungen im Qt Creator nachdem ich paintEvents auslöse:

Code: Alles auswählen

QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active
....
Ich vermute ich habe einen grundsätzlichen Fehler in der Struktur begangen. Leider komme ich als C++ Anfänger nicht darauf :oops:

Verfasst: 1. Mai 2009 09:54
von upsala
Das QLabel brauchst du nicht.
Das QImage füllst du mit schwarzer Farbe
Der Painter muß auf den viewport() geöffnet werden:

Code: Alles auswählen

QPainter painter(viewport());
Und der Kreis wird wieder überzeichnet.
Ich würde an deiner Stelle erst mal mit einem QWidget anfangen, und dann erst die QScrollArea nehmen.

QImage neu erstellen und mit QScrollArea ausgeben

Verfasst: 1. Mai 2009 13:30
von wlas
Hallo upsala,

vielen Dank für Deine schnelle Antwort! Leider stecke ich immer noch bei meinem Problem fest.
Mit

Code: Alles auswählen

QPainter painter(viewport()); 
hat es insofern funktioniert, dass ich direkt auf QScrollArea zeichnen konnte. Mein eigentliches QImage blieb weiterhin schwarz. Und ich will lediglich irgendwelche Grafik dort zeichnen, auf dem GUI anzeigen und später als JPG speichern. Jetzt habe ich Deinem Rat gefolgt und mein Code bis auf das Notwendigste abgespeckt (ohne QScrollArea und QLabel).

main.cpp:

Code: Alles auswählen

#include <QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])  {
   QApplication app(argc, argv);
   Window window;
   window.show();
   return app.exec();
}
mainwindow.h:

Code: Alles auswählen

#ifndef WINDOW_H
#define WINDOW_H

#include <QImage>
#include <QPainter>
#include <QtGui>
#include <QWidget>

class FlowGraph;

class Window : public QWidget
{
    public:
        Window();
    private:
        FlowGraph *MyFlowGraph;
};


class FlowGraph : public QWidget
{
    public:
        FlowGraph();
        QImage  image;

    protected:
        void paintEvent(QPaintEvent *event);

};

#endif


mainwindow.cpp:

Code: Alles auswählen

#include "mainwindow.h"

Window::Window()
{
    QVBoxLayout *layout = new QVBoxLayout;
    MyFlowGraph = new FlowGraph;
    layout->addWidget(MyFlowGraph);
    setLayout(layout);
    this->resize(420,220);


}
FlowGraph::FlowGraph()
{
    image = QImage(400, 200, QImage::Format_RGB32);
}



void FlowGraph::paintEvent ( QPaintEvent * event )
{
    QPainter painter(this);

    painter.setPen(QPen(Qt::white,4,Qt::DashDotLine, Qt::RoundCap));
    painter.setBrush(QBrush(Qt::green,Qt::SolidPattern));
    painter.drawEllipse(10,10,200,100);
    painter.drawImage(0, 0, image );

}

Einfacher geht es eigentlich nicht. Wie aber schon gehabt kriege ich nichts außer schwarzem Feld zu sehen :(

Verfasst: 1. Mai 2009 20:35
von upsala
Arbeite auch mal ohne das QImage, mal davon abgesehen, daß es von dir nicht initalisiert wird und du dann das Glück hast, daß es bei dir halt Schwarz ist...