2010-06-04 19 views
2

Je dois créer une boîte simple qui fait tourner une ellipse et du texte en fonction de la valeur de horizontalSlider/spinBox. Le widget doit être redimensionnable, et la taille de l'ellipse doit changer en fonction de cela.Qt erreur QPainter lors de la rotation d'une ellipse en utilisant horizontalSlider

Pour l'instant, seule l'ellipse est en train d'être peinte. La peinture de texte sera ajoutée si cela fonctionne. Le problème est que si la fenêtre après le redimensionnement dépasse la taille de la fenêtre d'origine, la peinture est bizarre.

window.h:

#ifndef WINDOW_H 
#define WINDOW_H 

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

class Window : public QWidget, private Ui::Form 
{ 
    Q_OBJECT 

public: 
    Window(QWidget *parent = 0); 

public slots: 
    void rotateEllip(int angle); 
    void rotateText(int angle); 

protected: 
    void paintEvent(QPaintEvent *event); 
}; 

#endif // WINDOW_H 

window.cpp:

#include "window.h" 

qreal textAngle = 0.0; 

qreal ellipAngle = 0.0; 

Window::Window(QWidget *parent) : QWidget(parent) 
{ 
    setupUi(this); 

    connect(spinBox_ellipse,SIGNAL(valueChanged(int)),this,SLOT(rotateEllip(int))); 
    connect(horizontalSlider_ellipse,SIGNAL(valueChanged(int)),this,SLOT(rotateEllip(int))); 
    connect(spinBox_text,SIGNAL(valueChanged(int)),this,SLOT(rotateText(int))); 
    connect(horizontalSlider_text,SIGNAL(valueChanged(int)),this,SLOT(rotateText(int))); 
} 

void Window::rotateEllip(int angle) 
{ 
    ellipAngle = (qreal) angle; 
    Window::Window(this); 
} 

void Window::rotateText(int angle) 
{ 
    textAngle = (qreal) angle; 
    Window::Window(this); 
} 

void Window::paintEvent(QPaintEvent *event) 
{ 
    QPen pen(Qt::black,2,Qt::SolidLine); 
    QPoint center(0,0); 

    QPainter painter(this); 

    painter.setRenderHint(QPainter::Antialiasing); 
/* Drawing ellipse*/ 


    painter.eraseRect(10,10,frame_ellipse->width(),frame_ellipse->height()); 
    painter.translate(frame_ellipse->width()/2+10,frame_ellipse->height()/2+10); 
    painter.rotate(ellipAngle); 
    if (frame_ellipse->width() > frame_ellipse->height()) painter.drawEllipse(center,(frame_ellipse->height()/4)-5,(frame_ellipse->height()/2)-10); 
    else if (frame_ellipse->width() <= frame_ellipse->height()) painter.drawEllipse(center,(frame_ellipse->width()/2)-10,(frame_ellipse->width()/4)-5); 
    painter.rotate(-ellipAngle); 
    painter.translate(-frame_ellipse->width()/2+10,-frame_ellipse->height()/2+10); 
} 

main.cpp est window.show normal() appelant.

+1

Veuillez formater le code correctement. Mettez en surbrillance le code et appuyez sur Ctrl + K. Plus d'infos -> http://stackoverflow.com/editing-help – Jujjuru

+0

Terminé merci. Je ne savais pas plus tôt que je ne l'avais pas lu. –

+0

Pourquoi appelez-vous le constructeur dans vos emplacements de rotation? Si vous voulez repeindre le widget, appelez update(). –

Répondre

1

Ma conjecture est l'appel au constructeur crée un objet widget temporaire et bousille le dessin.