2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 418

Наследование функции движения

14.02.2022, 20:38. Показов 3731. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, есть класс, который рисует машину:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//mainwindow.h
void Car::paintEvent(QPaintEvent *e) {
    Q_UNUSED(e);
 
    QPainter carPainter(this);
 
    QPen pen(Qt::black, 2);
    QPen pen_2(Qt::black, 1);
    carPainter.setPen(pen);
 
    carPainter.drawLine(250,130,450,130);
    carPainter.drawLine(250,130,200,200);
    carPainter.drawLine(450,130,500,200);
    carPainter.drawLine(500,200,200,200);
    carPainter.drawLine(450,130,500,103);
    carPainter.setBrush(QBrush(Qt::red));
    carPainter.drawRect(100,200,400,100);
 
    //колёса
    carPainter.setBrush(QBrush(Qt::black));
    carPainter.drawEllipse(150,260,80,80);
    carPainter.drawEllipse(380,260,80,80); //360
 
    carPainter.setBrush(QBrush(Qt::white));
    carPainter.drawEllipse(168,278,45,45);
    carPainter.drawEllipse(398,278,45,45);//378
 
    carPainter.drawLine(330,130,330,300);
    carPainter.drawLine(100,220,500,220);
 
    //фары
    carPainter.setPen(pen_2);
    carPainter.setBrush(QBrush(Qt::gray));
    carPainter.drawRect(100,220,15,30);
    carPainter.drawRect(485,220,15,30);
 
    carPainter.setPen(pen);
 
    carPainter.drawLine(200,200,200,260);
 
    //ручка
    carPainter.setBrush(QBrush(Qt::black));
    carPainter.drawRect(300,220,20,10);
 
}
нужно, чтобы она двигалась вправо и влево. но есть класс, в котором осуществлено движение прямоугольника.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//mainwindow.h
void Rectangle::keyPressEvent(QKeyEvent *event) {
   int step = 10; 
   int origin = QPoint(50,50);
    switch(event->key()){
    case Qt::Key_Left:
    {
        int x=origin.x();
        origin.setX(x-step);
        update();
        break;
    }
 
    case Qt::Key_Right:
    {
        int x=origin.x();
        origin.setX(x+step);
        update();
        break;
    }
    case Qt::Key_Up:
    {
        int y=origin.y();
        origin.setY(y-step);
        update();
        break;
    }
    case Qt::Key_Down:
    {
        int y=origin.y();
        origin.setY(y+step);
        update();
        break;
    }
    }
 
 
    QWidget::keyPressEvent(event);
 
}
как можно наследовать данную функцию для родительского класса "Car"?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2022, 20:38
Ответы с готовыми решениями:

Дружественные функции. Наследование. Перегрузка функции
Здравствуйте, у меня проблема Не знаю куда Вставить имеющийся код(В какую строчку или строчки кода). Первый код это было 1 задание, 2-ой...

Наследование функции
Условие: функция должна быть задана вне класса. { class evm { protected: char *a; public: ...

Наследование и функции
Помогите исправить ошибки в проекте, не понимаю что не так с объявлением и наследованием, помогите разобраться пожалуйста есть класс...

36
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 418
16.02.2022, 22:13  [ТС]
Студворк — интернет-сервис помощи студентам
sdf45, спасибо буду пытаться разобраться в этом))

Добавлено через 19 минут
а как можно сделать вращение против часовой стрелки?
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
16.02.2022, 22:25
volver, в последнем примере, который я выложил, по таймеру меняется направление вращения.
painter.rotate() просто задать отрицательный угол.
(только имейте ввиду, rotate и translate изменяют не саму геометрию, которую рисуем, а систему координат, в которой рисуем)
0
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 418
16.02.2022, 22:29  [ТС]
sdf45, а как понять, изменяет систему координат?
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
16.02.2022, 22:39
Цитата Сообщение от volver Посмотреть сообщение
как понять, изменяет систему координат?
ну представьте у Вас дома стоит кульман, на котором приколот лист бумаги. Вы хотите нарисовать прямоугольник , стороны которого параллельны краям листа.
И вдруг внезапно настал интерстеллар, и лист бумаги повернулся на 30 градусов, и повернулась вся Ваша комната и Вы вместе с ней, на 30 градусов. А кульман остался в том же положении как и был. Для Вас листок бумаги не поворачивался, так как вы повернулись вместе с ним. Здесь кульман-это виджет (область рисования QWidget), а лист бумаги-это система координат
0
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 418
16.02.2022, 22:49  [ТС]
sdf45, всё, понял теперь)

Добавлено через 8 минут
sdf45, а мы же можем вращать определенный объект (например как в моём примере - дверь, состоящую из отрезков)
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
16.02.2022, 23:01
volver, можно нарисовать повернутый обьект, например
painter.translate(point); перенести начало координат в точку point
painter.rotate(angle); //повернуть систему координат на angle
painter.drawRect(QRect(0,0,10,10));
нарисует повернутый квадрат, причем рисование его начнется от точки point

но как я уже говорил, после отрисовки Вы с этим квадратом, если он задан в абсолютных координатах, сделать ничего не сможете.

поэтому надо параметризировать point и angle, тоесть где-то задаете (анимируете по таймеру или управлением с мышки или клавиатуры) угол поворота двери и точку, вокруг которой она повернется, и делаете update(),
0
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 418
16.02.2022, 23:07  [ТС]
sdf45, а как это осуществить? Что-то не совсем понимаю...
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
16.02.2022, 23:18
volver, в последнем примере посмотрите, там крутится прямоугольник по таймеру.
Если тот код сложный пока для Вас, напишите в paintEvent()
painter.drawRect(0,0,100,100);
painter.translate(point);
painter.rotate(angle);
painter.drawRect(QRect(0,0,50,50));
painter.translate(0,0);

а где-то в конструкторе попробуйте менять point и/или angle, и вызывать update();
0
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 418
17.02.2022, 21:02  [ТС]
sdf45, что-то не получается это сделать в итоге...
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
17.02.2022, 21:04
volver, покажите код
0
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 418
17.02.2022, 22:13  [ТС]
sdf45, я пробовал разными способами. Самый последний остался такой:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#ifndef CAR_H
#define CAR_H
 
#include <QWidget>
#include <QPainter>
#include <QPaintEvent>
#include <QTimer>
 
class car : public QWidget
{
    Q_OBJECT
 
private:
    int angle {45};
    int direction;
    int angleStep {10};
    QPoint point;
 
public:
     car(QWidget *parent = nullptr): QWidget(parent){
 
 
 
         QTimer* timerRotate = new QTimer(this);
         QTimer* timerDirection = new QTimer(this);
 
 
         connect(timerRotate, &QTimer::timeout,[this]{
 
             setAngle(getAngle() + angleStep * direction);
             update();
         });
 
 
         connect(timerDirection, &QTimer::timeout,[this]{
             changeDirection();
             update();
         });
 
 
         timerRotate->start(100);
         timerDirection->start(3000);
 
     }
 
     void setAngle(const int& a) {
         angle = a;
     }
 
     int getAngle()const{
         return angle;
     }
 
     void changeDirection(){
         direction *=-1;
     }
 
    void paintEvent(QPaintEvent *event) {
 
            QPainter carPainter(this);
 
            QPen pen(Qt::black, 2);
            QPen pen_2(Qt::black, 1);
            carPainter.setPen(pen);
 
            carPainter.drawLine(650,130,850,130);
            carPainter.drawLine(650,130,600,200);
            carPainter.drawLine(850,130,900,200);
            carPainter.drawLine(900,200,600,200);
            carPainter.drawLine(850,130,900,103);
            carPainter.setBrush(QBrush(Qt::red));
            carPainter.drawRect(500,200,800,100);
 
            //колёса
            carPainter.setBrush(QBrush(Qt::black));
            carPainter.drawEllipse(550,260,80,80);
            carPainter.drawEllipse(780,260,80,80); //360
 
            carPainter.setBrush(QBrush(Qt::white));
            carPainter.drawEllipse(568,278,45,45);
            carPainter.drawEllipse(798,278,45,45);//378
 
            carPainter.drawLine(730,130,730,300);
            carPainter.drawLine(500,220,900,220);
 
            //фары
            carPainter.setPen(pen_2);
            carPainter.setBrush(QBrush(Qt::gray));
            carPainter.drawRect(500,220,15,30);
            carPainter.drawRect(885,220,15,30);
 
            carPainter.setPen(pen);
 
  /**/          carPainter.drawLine(600,200,600,260);
            carPainter.translate(point);
            carPainter.rotate(angle);
            carPainter.translate(0,0);
 
            //ручка
            carPainter.setBrush(QBrush(Qt::black));
            carPainter.drawRect(700,220,20,10);
 
 
        QWidget::paintEvent(event);
    };
 
};
 
#endif // CAR_H
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
17.02.2022, 22:22
Цитата Сообщение от volver Посмотреть сообщение
/**/          carPainter.drawLine(600,200,600,260);
            carPainter.translate(point);
            carPainter.rotate(angle);
//тут рисуйте дверь
            carPainter.translate(0,0);
point-это точка, вокруг которой будет поворачиваться дверь-в коде нигде не задана и не меняется.

попробуйте на паре прямоугольников потренироваться
0
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 418
18.02.2022, 00:47  [ТС]
sdf45, а как мы можем изменять point?

изначально он равен (550, 260).
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
18.02.2022, 01:05
Цитата Сообщение от volver Посмотреть сообщение
как мы можем изменять point?
C++ (Qt)
1
2
3
4
QPoint point (550, 260);
point=QPoint (100, 100);
point.setX(50);
point.setY(18);
0
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 418
18.02.2022, 01:08  [ТС]
sdf45, тобишь в конструкторе должно быть так?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
car(QWidget *parent = nullptr): QWidget(parent){
 
 
 
         QTimer* timerRotate = new QTimer(this);
         QTimer* timerDirection = new QTimer(this);
 
 
         connect(timerRotate, &QTimer::timeout,[this]{
 
             setAngle(getAngle() + angleStep * direction);
             update();
         });
 
 
         connect(timerDirection, &QTimer::timeout,[this]{
             changeDirection();
             update();
         });
 
 
         timerRotate->start(100);
         timerDirection->start(3000);
 
         QPoint point (550, 260);
         point=QPoint (100, 100);
         point.setX(50);
         point.setY(18);
 
     }
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
18.02.2022, 01:25
volver, я просто пару способов задания значений показал
Можете указать значения и посмотреть что произойдет, потом поменять значения и еще посмотреть
Можете по таймеру сделать изменение, можете циклом, можете как угодно. Не забудте после изменения вызвать update()

Добавлено через 3 минуты
вообще Вы бы посмотрели документацию по QPainter, там расписано очень подробно

Добавлено через 43 секунды
https://doc.qt.io/qt-5/qpainter.html

Добавлено через 5 минут
QPoint point (550, 260); // инициализация при создании

изменение значения:

point=QPoint (100, 100); //первый вариант

point.setX(50); //второй вариант
point.setY(18);
0
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 418
13.03.2022, 13:41  [ТС]
sdf45, здравствуйте, можете помочь пожалуйста с вращением объекта. Никак не получается сделать плавное вращение через QTimer:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    {
 
 
            QPoint p0(600, 500);
            QTransform t;
            t.translate(p0.x(),p0.y()); 
 
            t.rotate(-45);
            t.translate(-p0.x(),-p0.y());
            carPainter.setTransform(t);
            update();
 
 
        //дверь
            carPainter.setBrush(QBrush(Qt::white));
            QPolygon polygon;
            polygon << QPoint(650,430) << QPoint(730,430) << QPoint(730,600) << QPoint(600,600) << QPoint(600,500);
         carPainter.drawPolygon(polygon);
 
 
        carPainter.setBrush(QBrush(Qt::white));
         carPainter.setBrush(QBrush(Qt::red));
        carPainter.drawRect(600,500,129,100);
        //ручка
        carPainter.setBrush(QBrush(Qt::black));
        carPainter.drawRect(700,520,20,10);
 
 
 
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.03.2022, 13:41

Наследование и виртуальные функции
Написать программу в которой создается иерархия классов.Включить полиморфные обьекты в связанный список,используя статистические компоненты...

Наследование. Виртуальные функции
Всем привет. Недавно изучил раздел , который в названии. Вы могли бы дать задачку по выше указанной теме над которой надо хорошо подумать?

Наследование и виртуальные функции
Здравствуйте! помогите дописать программу, в которой создается иерархия классов. Включить полиморфные объекты в связанный список,...

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

Наследование и виртуальные функции
⦁ Определить иерархию классов (в соответствии с вариантом). ⦁ Определить в классе статическую компоненту - указатель на начало...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Опции темы

Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru