Ошибка Qt QPainter при повороте эллипса с помощью horizontalSlider

Мне нужно создать простой блок, который вращает эллипс и некоторый текст в зависимости от значения из horizontalSlider / spinBox. Размер виджета должен изменяться, и размер эллипса должен меняться в зависимости от этого.

Пока закрашивается только эллипс. Текст будет добавлен, если это сработает. Проблема в том, что если размер окна после изменения размера превышает исходный размер окна, картина получается странной.

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 ().


person Khushman Patel    schedule 04.06.2010    source источник
comment
Пожалуйста, отформатируйте код правильно. Выделите код и нажмите Ctrl + K. Дополнительная информация - ›stackoverflow.com/editing-help   -  person Jujjuru    schedule 04.06.2010
comment
Готово, спасибо. Раньше не знал, потому что не читал.   -  person Khushman Patel    schedule 04.06.2010
comment
Почему вы вызываете конструктор в своих слотах вращения? Если вы хотите перекрасить виджет, вызовите update ().   -  person Stephen Chu    schedule 04.06.2010
comment
Хорошо. Проблема тоже решилась. Спасибо, Стивен Чу.   -  person Khushman Patel    schedule 04.06.2010


Ответы (1)


Я предполагаю, что вызов конструктора создает временный объект виджета и портит рисунок.

person Stephen Chu    schedule 04.06.2010