Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
2 / 2 / 0
Регистрация: 18.09.2021
Сообщений: 418

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

14.02.2022, 20:38. Показов 3710. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru