QPainter blad przy inicjalizacji

0

Witam wszystkich.
Chciałbym aby w jednej z zakładek rysowany był wykres funkcji. Wyczytałem w internecie że można to zrealizować za pomocą QPainter. Jednak mam pewien problem z tym gdyż postępując wedle znalezionych wskazówek otrzymuje taki kod błędu; program się uruchamia jednak nic narysowanego nie ma.
QPainter: Paint device returned engine == 0, type: 1

kawałek mojego kodu to np.:

void ValueTab::paintEvent (){

     QPainter painter(this);
     painter.setRenderHint(QPainter::Antialiasing);
     painter.translate(width() / 2, height() / 2);
     painter.scale( 20.0,  20.0);
     painter.drawLine(88, 0, 96, 0);

}

Oczywiście ValueTab jest jedną z tych zakładek.
Wiem ze to pewnie jakas prościzna ale nic mi nie przychodzi do głowy a parę innych rozwiązań też już próbowałem.
Dziękuję z góry za pomoc.

0

Szybkie szukanie w google i od razu widać w czym problem: http://tamss60.tamoggemon.com/2010/01/10/qpainterbegin-paint-device-returned-engine-0-type-1-2/
Czyli rysujesz poza obszarem widgeta.
Ty powiększasz obraz razy 20! Czy twój widget zajmuje aż 96202 = 3840 pikseli szerokości? (razy dwa bo przesuwasz układ współrzędnych do środka)

0

tak znalazłem tą odpowiedź jednak nie zabardzo umiałem sobie mimo tego poradzić, bo to nie dokońca chodziło o to skalowanie tylko o to że nie było "płótna" w sensie podłoża i rysowałem niby po QtabWidget czy coś takiego. teraz przerobiłem trochę mój kod ta że zrobiłem oddzielną klasę do rysowanie i przy kompilacji ( nawet z tym skalowaniem nie mam tego błędu ) ale nawet gdy próbuje wypisać tekst to nic się nie dzieje. Mój kod:

void Drawing::paintEvent(QPaintEvent* )
{
   QPainter painter(this);
   QColor kolor(255, 0, 255);

   painter.setPen(kolor);
   painter.drawText(10, 10, "tekst");
   this->update();
   this->setFixedSize(100,100);
}


Drawing::Drawing(QWidget* parent) : QWidget(parent){ }


ValueTab::ValueTab( QWidget *parent )
{
    Drawing obrazek;
    obrazek.show();
}
     
0

NIGDY nie wywołuj update w paintEvent! Duży błąd! update oznacza zawartość widgeta się zmieniła należy ją odrysować na nowo, więc masz potencjalną nieskończoną pętlę.
setFixedSize też nie powinno się znaleźć w paintEvant.

Po jakim widget'cie dziedziczysz?

Jeszce jedno jak chcesz wykresy to poszukaj Qwt (biblioteka do qt).

0

o dzięki za te porady. Po ValueTab które dziedziczy po Dialog.

0

Czemu po QDialog? Ten widget ze swojej natury nie powinien mieć metody paintEvent, ale być rodzicem dla innych widgetów.
Dziedzicz po QWidget jeśli chcesz rysować własne rzeczy.

0

nie sorka pomyłka źle spojrzałem, żeby już nie popełnić tego błędu zamieszczę tutaj uproszczone deklaracje:


class Dialog : public QDialog
{
    Q_OBJECT

private:
    QTabWidget *tabWidget;
    GradeTab *_GradeTab;
    WspTab *_WspTab;
    ValueTab* _ValueTab;
    
public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
 };


class ValueTab : public QWidget
{
    Q_OBJECT

private:
public:
    ValueTab( QWidget *parent = 0 );
};

class Drawing : public QWidget
{
public:
    void paintEvent(QPaintEvent*);
    Drawing(QWidget* parent=0);
};
 

Dzięki za pomoc MarekR22 o Qwt na pewno poczytam, jak na razie udało mi się zrobić że działa ale jeszcze nie doszedłem do tego co było źle.
Pozdrawiam Ghost

1 użytkowników online, w tym zalogowanych: 0, gości: 1