Meldung bei Gebrauch von QPainter

Alles rund um die Programmierung mit Qt
Antworten
Marcus Breuer
Beiträge: 113
Registriert: 31. März 2011 17:19
Wohnort: Aachen
Kontaktdaten:

Meldung bei Gebrauch von QPainter

Beitrag von Marcus Breuer »

Hallo Forum,

ich habe ein kleines Programm ausgearbeitet, dass auch genau das tut, was ich möchte. Allerdings bekomme ich immer folgende Meldung generiert:

QPainter::begin: A paint device can only be painted by one painter at a time.

Ganz kurze Erklärung, mittels Datenbankabfragen, hole ich mir alle Daten, die gezeichnet werden sollen und übergebe diese meinem "DrawWidget". Je nachdem, wie viele Spalten in der Tabelle mit Messwerten enthalten sind, lege ich dementsprechend viele Tabs in einem TabWidget an. Auf jeden einzelnen dieser Tabs setze ich dann eines meiner "DrawWidgets"


Hier die hoffentlich relevanten Codeabschnitte, die helfen sollten, die Meldung nachvollziehen zu können:

Code: Alles auswählen

for(int k=0; k<Messwerte.size(); ++k)
        {
            TabsOfTypeDrawWidget.append(new DrawWidget(Messwerte[k]));
        }

Code: Alles auswählen

 for(int i=0; i<TabsOfTypeDrawWidget.size(); i++)
    {
        ui->TW_DrawDiagram->addTab(TabsOfTypeDrawWidget[i], "Test");
        TabsOfTypeDrawWidget[i]->setFixedSize(ui->TW_DrawDiagram->width(), ui->TW_DrawDiagram->height());
    }
und noch die Klasse DrawWidget

Code: Alles auswählen

#include "drawwidget.h"
#include "ui_drawwidget.h"

DrawWidget::DrawWidget(QVector<int> Messwerte, QWidget *parent) :
    QWidget(parent),
    ui(new Ui::DrawWidget),
    MesswerteKopie(Messwerte)
{
    ui->setupUi(this);

    setAutoFillBackground(true);
    setBackgroundRole(QPalette::BrightText);


}


DrawWidget::~DrawWidget()
{
    delete ui;
}


void DrawWidget::paintEvent(QPaintEvent* Event)
{

    QPainter Painter(this);
    Painter.begin(this);
    Painter.setPen(QPen(Qt::black, 2));

    Painter.drawLine(10, 10, 10, this->height()-40);
    Painter.drawLine(10, this->height()-40, this->width()-10, this->height()-40);


    for(int i=10, j=0; i<this->width()-10, j<MesswerteKopie.size(); i+=20, j++)
    {

        if(MesswerteKopie[j] < 30)
            Painter.setPen(QPen(Qt::green, 2));
        else
            Painter.setPen(QPen(Qt::red, 2));

        Painter.drawPoint(i, this->height()-40-MesswerteKopie[j]);
    }


    Painter.end();
}

Die Daten darin sind erstmal nur exemplarisch. Die einzelnen Werte werden aber richtig gezeichnet. Dennoch immer wieder diese Meldung, die in der Anzahl der Tabs ausgegeben wird.

Was ich nicht verstehe, der Painter wird ja innerhalb von DrawWidget::painEvent(QPaintEvent*) geöffnet und auch wieder geschlossen, deswegen hat die Meldung für mich keinen Sinn.

Besteht sonst die Möglichkeit unter Windows und Mac OS etwas in der Art hinzubekommen, wie Qt::WA_PaintOutsidePaintEvent ?

Oder würdet Ihr mir generell vielleicht zu etwas anderem raten, als QPainter zur Ausgabe einer simplen Diagramms?

Ich freue mich über jede Hilfestellung. Schönen, sonnigen Pfingsttag,
Marcus
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Meldung bei Gebrauch von QPainter

Beitrag von franzf »

Aus meiner python-Konsole:

Code: Alles auswählen

>>> from PyQt4.Qt import *
>>> app = QApplication([])
>>> pix = QPixmap(100,100)
>>> pix.fill(Qt.white)
>>> painter = QPainter(pix)
>>> painter.begin(pix)
QPainter::begin: A paint device can only be painted by one painter at a time.
False
Ist es jetzt klar? Wenn nicht, Doku zu QPainter-Konstruktor anschauen.
Marcus Breuer
Beiträge: 113
Registriert: 31. März 2011 17:19
Wohnort: Aachen
Kontaktdaten:

Re: Meldung bei Gebrauch von QPainter

Beitrag von Marcus Breuer »

hallo franzf,

dankeschön für deine antwort. ich habe gerade nochmal in die doku geschaut, aber ich befürchte, ich stehe auf dem schlauch. ich will nicht dreist sein, aber kannst du mir noch einen fingerzeig geben?

bzw. warum funktioniert mein programm dann trotzdem?

viele grüße,
marcus
Marcus Breuer
Beiträge: 113
Registriert: 31. März 2011 17:19
Wohnort: Aachen
Kontaktdaten:

Re: Meldung bei Gebrauch von QPainter

Beitrag von Marcus Breuer »

ach, schon gut. einfach Painter.begin(this); und Painter.end(); weggelassen. ich stehe zwar immer noch auf dem schlauch, wieso weshalb warum und die sonne schien mir den ganzen tag auf den kopf, aber es läuft.

dank dir. grüße
Herzogswalder
Beiträge: 79
Registriert: 11. Oktober 2009 00:37
Wohnort: Dresden

Re: Meldung bei Gebrauch von QPainter

Beitrag von Herzogswalder »

Weil du bereits im Constructor das Paintdevice (this) übergibst. Steht aber auch so in der Doku. :wink:
Gruß, Herzogswalder
Qt 4.8, OS X Mountain Lion
Marcus Breuer
Beiträge: 113
Registriert: 31. März 2011 17:19
Wohnort: Aachen
Kontaktdaten:

Re: Meldung bei Gebrauch von QPainter

Beitrag von Marcus Breuer »

hallo herzogswalder,

danke auch für deine antwort. das war das dicke brett vor dem kopf:) ich hatte mir die meldung komplett falsch zusammengereimt und war irritiert davon, dass die meldung immer so oft erschien, wie ich tabs hatte. aber jetzt ist es klar.

vielen dank euch beiden.

grüße
Marcus Breuer
Beiträge: 113
Registriert: 31. März 2011 17:19
Wohnort: Aachen
Kontaktdaten:

Re: Meldung bei Gebrauch von QPainter

Beitrag von Marcus Breuer »

so, eine frage aber doch noch:)

ist der qpainter an sich geeignet, um diagramme, mit legenden und co. zu zeichnen? ich habe da auch qgraphicsscene und -view im auge. bspw. habe ich momentan ein nicht wirkliches problem, aber wenn ich versuche, das diagramm, bzw. dessen gezeichnete achsen so auszurichten, dass der nullpunkt und das sichtbare ende der x-achse links wie rechts den gleichen abstand vom eltern-widget haben, dann haut das nicht so ganz hin und das stört mich noch. bspw. setze ich das ende vom nullpunkt nach links mit 10px an und dann das ende des rechten endes der achse mit this->width()-10. da sollte dann ja eigentlich auch alles glatt gehen. aber die abstände sind unterschiednlich. zwar nur minimal, aber es stört mich einfach.

also das ist jetzt viel kleingekleckere in der frage, einfach nur eine antwort aus der erfahrung, was sich besser zum zeichnen "vollständiger" diagramme eignet, wäre toll.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Meldung bei Gebrauch von QPainter

Beitrag von franzf »

Ist halt wie bei Arrays: Man fängt bei 0 zu zählen an, damit ist das letzte Kästchen nicht bei size sondern bei size-1.
Marcus Breuer
Beiträge: 113
Registriert: 31. März 2011 17:19
Wohnort: Aachen
Kontaktdaten:

Re: Meldung bei Gebrauch von QPainter

Beitrag von Marcus Breuer »

hallo franzf,

jetzt hat es eine halbe ewigkeit gebraucht, eh ich zum antworten kam. es stimmt allerdings auch in der höhe nicht. wenn ich auf meinem widget zeichnen möchte, dann müsste der nullpunkt des koordinatensystems ja in der oberen linken ecke bei (0,0) sein. und jeweils in breite und höhe bis width()-1 und height()-1 gehen. damit zeichne ich aber schon weit über den rand meines widgets hinaus. ich muss nochmal genauer in die doku schauen. aber sinnig erscheint es mir so oder so erstmal nicht.

beste grüße,
marcus
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Meldung bei Gebrauch von QPainter

Beitrag von franzf »

Dann bitte ein komplettes, kompilierbares Beispiel (incl. .ui, .pro, ohne libs, exe, ...), das dein Problem aufzeigt.
Marcus Breuer
Beiträge: 113
Registriert: 31. März 2011 17:19
Wohnort: Aachen
Kontaktdaten:

Re: Meldung bei Gebrauch von QPainter

Beitrag von Marcus Breuer »

Hallo franzf,

also grob nochmal eine Übersicht. Ich habe ein TabWidget, auf das ich Tabs meines eigenen Zeichenwidgets setzen möchte. Im Moment ist es nur zur Ausgabe einiger Werte und Zeichnen eines, als halbwegs erkennbaren Koordinatensystems in der Lage.

Beigefügt ist ein kleines Projekt, in dem aber alles zu finden ist, wie im "Großen" auch. Es lässt sich kompilieren und verdeutlicht mein Problem.

Wenn Du es öffnest, dann siehst Du direkt, dass auf dem TabWidget das Zeichenwidget angezeigt wird. Ein paar Werte eingezeichnet sind und das, naja, nennen wir es mal Koordninatensystem. Du kannst in "drawwidget.cpp" sehen, dass ich, um die horizontale Koordinatenachse zu zeichnen, so dass sie sichtbar ist, etwa Werte wie this->height()-40 benutze. Eigentlich würde ich erwarten, dass this->height()-1 ja dann am unteren Rand zeichnen würde. Aber ich muss schon auf fast bis -40 hochgehen, damit die Achse sichtbar wird. Für die Vertikale Achse scheint es weniger problematisch zu sein.

Ich hoffe, es ist nicht nur Dummheit, die mich davon abhält, da ein schönes Koordinatensystem zu zeichnen.

Viele Dank für jede Hilfe. Beste Grüße,
Marcus
Dateianhänge
test.zip
(3.33 KiB) 313-mal heruntergeladen
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Meldung bei Gebrauch von QPainter

Beitrag von Christian81 »

Du setzt deinem Widget eine Fixed size die aber zu groß ist um im TabWidget alles anzuzeigen.
FixedSizes sind nie sinnig - benutze Layouts !
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Marcus Breuer
Beiträge: 113
Registriert: 31. März 2011 17:19
Wohnort: Aachen
Kontaktdaten:

Re: Meldung bei Gebrauch von QPainter

Beitrag von Marcus Breuer »

Hallo Christian81,

gerade ausprobiert und es funktioniert perfekt. Vielen Dank für die Hilfe. Und auf fixe Größen werde ich dann wohl tatsächlich in nächster Zeit völlig verzichten.

Beste Grüße,
Marcus
Antworten