[Qt] Dziedziczenie a paintEvent

0

Cześć, potrzebuję rozbić rysowanie na dwie klasy, napisałem więc sobie krótki program, który jak łatwo się domyśleć nie działa. Przy próbie odpalenia wywala mi segmentation fault. Próbowałem go z debugować, ale wywala mi tylko na linii 0, w formie rozkazów asemblerowych jakąś instrukcję dotyczącą przenoszenia między rejestrami, więc nic mi to nie pomogło. Program jest krótki więc zamieszczę poniżej cały.
painter.h :

#ifndef PAINTER_H
#define PAINTER_H
#include <QWidget>

class Painter : public QWidget {
  Q_OBJECT
  public:
    QWidget *paintDevice;
    Painter(QWidget *parent = 0);
    virtual void paintEvent(QPaintEvent *);
    QPainter *painter;
    QWidget *paintParent;
    double hh;
    double ww;
    void draw(QPaintEvent *,QWidget *);

};
#endif // PAINTER_H

painter.cpp

#include<QtGui>
#include "painter.h"

Painter::Painter(QWidget *parent) :
    QWidget(parent)
{
  setMinimumSize(400,400);
  setBackgroundRole(QPalette::Base);
}

void Painter::draw(QPaintEvent *event,QWidget *parent){
  paintParent = parent;
  this->paintEvent(event);

}

void Painter::paintEvent(QPaintEvent *){
  painter = new QPainter(paintParent);
  ww = paintParent->width()/10;
  hh = paintParent->height()/10;
}

painterline.h :

#ifndef PAINTERLINE_H
#define PAINTERLINE_H

#include<QWidget>
#include"painter.h"

class PainterLine : public Painter {
  Q_OBJECT
public:
    void paintEvent(QPaintEvent *);
};

#endif // PAINTERLINE_H

painterline.cpp :

#include<QtGui>
#include "painterline.h"

void PainterLine::paintEvent(QPaintEvent *event){
  draw(event,this);
  painter->drawRect(QRect(50,50,ww,hh));
}

main.cpp :

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

int main(int argc,char *argv[]){
  QApplication app(argc,argv);
  PainterLine *rysuj;
  rysuj->show();
  return app.exec();
}
0
  PainterLine *rysuj;
  rysuj->show();

Nie tworzysz obiektu, dalej nie szukałem :)

0
  1. za takie nazwanie klasy widget'u to bym cię powiesił na najbliższym drzewie
  2. masz olbrzymi wyciek pamięci tworzysz QPainter w Painter::paintEvent a nigdy go nie usuwasz.
  3. chcesz zrobić modyfikację rysowania bez tworzenia kilka razy QPainter to stwórz swoją metodę wirtualną np: void draw(QPainter* painter); i to ONA powinna być wywołana przez paintEvent a nie na odwrót. paintEvent jest wywoływany przez engine Qt rysujący okono.
0

Brak tworzenia obiektu wynikł z nadmiernej szybkości :) Nie zwracałem uwagi na nazwę klas, bo kod jest stworzony tylko do przedstawienia i rozwiązania problemu. Jest mi to potrzebne do większego programu, w którym mam tylko jedną klasę do rysowania wykorzystywaną w różnych częściach programu i trochę się rozrosła, chciałem to wszystko uporządkować. Początkowo zamierzałem wywołać po prostu dwa razy painEvent, metody z argumentem QPainter zresztą już mam, w sumie nie wiem dlaczego nie pomyślałem aby ten fragment kodu też tak zmienić. O usuwaniu obiektu QPainter faktycznie zapomniałem. Dzięki za pomoc.

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