Мне необходимо сделать анимацию перемещения точки 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);
}
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);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Задача такова, что в обычном тексте на русском языке, который находится в файлеtxt выделить оттуда кусок текста, выбрать из него слова и отсортировать...
Вот простенький код, на экран выводит число равное 3, почему? откуда взялись эти 3 байта