2010-06-04 75 views
2

我必须创建一个简单的框,它根据horizo​​ntalSlider/spinBox的值旋转椭圆和一些文本。该小部件必须可以调整大小,并且椭圆的大小必须根据不同而改变。Qt使用horizo​​ntalSlider旋转椭圆时出现QPainter错误

现在只有椭圆被绘。如果这个工作,文字画将被添加。问题是,如果调整大小后的窗口超过原始窗口大小,绘画就很奇怪。

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中是正常window.show()调用。

+1

请正确格式化代码。突出显示代码并按下Ctrl + K。更多信息 - > http://stackoverflow.com/editing-help – Jujjuru 2010-06-04 07:49:14

+0

完成谢谢。我之前并不知道,因为我没有读过它。 – 2010-06-04 09:27:51

+0

为什么你在旋转槽中调用构造函数?如果您想重新绘制小部件,请调用update()。 – 2010-06-04 12:51:36

回答

1

我的猜测是对构造函数的调用创建了一个临时窗口小部件对象,并将图形弄乱。