Предупреждение Сannot Destroy Paint Divace that is being painting

138
06 февраля 2021, 21:50

Мне необходимо сделать анимацию перемещения точки QPoint по траектории графика синусоиды. Рисую я график в функции void QPaintEvent(QPaintEvent *event) Там же задаю начальное положение точки, которую нужно переместить и объявляю QPainter.

В конструкторе у меня объявлен таймер startanimation, который я запускаю по нажатии на кнопку. Таймер при переполнении выполняет этот слот

void MainWindow::paintEventWarm(){
animationpoint.setX((4*count));
animationpoint.setY(sin(animationpoint.x()));
count+=1;
update();
}

Где я устанавливаю новые координаты для точки, которую надо перемещать. Ошибок программа не выдает, но есть предупреждение

Сannot Destroy Paint Divace that is being painting.

и таймер не переполняется.

Вот скриншот

Если же вставить в QPaintEvent(QPaintEvent *event)

 painter->end();

И заново объявить его уже в функции paintEventWarm(), то таймер начинает работать, но в консоль каждый тик выдается сообщение

QPainter::begin: Paint device returned engine == 0, type: 1

Помогите правильно сделать анимацию.

Метод paintEvent

    void MainWindow::paintEvent(QPaintEvent *event){
    painter = new QPainter(this);
painter->setRenderHint(QPainter::Antialiasing);
QPen BlackPen (Qt::black);
BlackPen.setWidth(1);
QPen BluePen (Qt::blue);
BluePen.setWidth(2);

QPoint p1,p2;
int sh = width()/2;
p1.setX(0);
p1.setY(sh);
p2.setX(width());
p2.setY(sh);
painter->setPen(BlackPen);
//painter->drawLine(p1,p2);
painter->drawRect(0, 0, width(), height());
painter->setPen(BluePen);
// Строим синусоиду
p2.setX(0);
p2.setY(sh);
painter->setPen(BluePen);
for (int i = 0; i<bufer.size();i+=2){
    p1 = p2;
    p2.setX(bufer.at(i));
    p2.setY (sh+bufer.at(i+1));
    painter->drawLine(p1,p2);

   }
painter -> setPen(QPen(QBrush(Qt::red),12));
animationpoint.setX(0);
animationpoint.setY(sh +100);
painter->drawPoint(animationpoint);
}

А вот функция, которая готовит для графика данные

void MainWindow::MakeData(int value){
float x, y, point_x, point_y;
int mas_y;
const int size_x = width();
const int size_y = height()/6;
bufer.clear();
for (point_x = 0; point_x < size_x; point_x+=3){
    x = 30*point_x/size_x;
    switch(value){
    case 0: break;
    case 1: {
        y=sin(x);
        mas_y=4;
        break;
    };
    case 2: {
        y = 2*pow(x,2)-14*x;
        mas_y = 70;
        break;
    };
    case 3: {
        y = tan(x);
        mas_y = 500;
        break;
    };
    case 4: {
        y = atan(x);
        mas_y = 4;
        break;
    }
    };
    point_y = (size_y-(y+1)*size_y/mas_y);
    bufer << point_x << point_y;
    }
 }

Обработчик нажатия на кнопку

void MainWindow::painEventPath(){
QString str = "value1";
MakeData(str.remove(0,5).left(5).toInt());
this -> repaint();
startanimation->start(1000);
}
Answer 1
MainWindow::MainWindow(...):... {
    connect(timer, &QTimer::timeout, [&]() {
        // Cуть в том, чтобы сделать шаг для смещения точки
        animationpoint.setX(<Новый Х>);
        animationpoint.setY(<Новый Y>);
        update();    
    }
}
void MainWindow::paintEvent(QPaintEvent* evt) {
    QPainter painter(this); // Не надо указатель
    // ...
    Настройки для выдления точки цветом, формой, размерами    
    // Следующие две строчки держат вашу точку на одном месте. Видимо их надо удалить
    // animationpoint.setX(0);
    // animationpoint.setY(sh +100);
    painter.drawPoint(animationpoint);
}
READ ALSO
Шаблоны классов [дубликат]

Шаблоны классов [дубликат]

не могу исправить ошибку, компилятор выдает

93
Сортировка слов по алфавиту

Сортировка слов по алфавиту

Задача такова, что в обычном тексте на русском языке, который находится в файлеtxt выделить оттуда кусок текста, выбрать из него слова и отсортировать...

113
C, откуда 3 байта?

C, откуда 3 байта?

Вот простенький код, на экран выводит число равное 3, почему? откуда взялись эти 3 байта

92