Ошибка Qt QPainter при вращении эллипса с использованием horizontalSlider - PullRequest
2 голосов
/ 04 июня 2010

Мне нужно создать простую коробку, которая вращает эллипс и некоторый текст в зависимости от значения от 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 ().

1 Ответ

1 голос
/ 05 июня 2010

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

...