Russian Qt Forum
Ноябрь 25, 2024, 06:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с Qt Painter  (Прочитано 4723 раз)
AndeRVRN
Гость
« : Сентябрь 28, 2015, 23:52 »

Задача такая: имитировать движение секундной стрелки.
Ну я планирую сделать это так, рисовать стрелку в её исходном положении, потом стирать её и рисовать уже сдвинутую на 6 градусов по часовой стрелке.
Ну с помощью paintEvent нарисовал линию, теперь возник вопрос, а как стереть её? В смысле как снова вызвать paintEvent уже с другим Pen(с цветом фона) чтобы просто поверх этой линии нарисовать еще одну, с цветом фона.

Пробовал создать свою функцию и вставить туда этот код, он не работал. Работает только в paintEvent. А как его вызывать еще раз, после запуска программы, не пойму... подскажите.

Код:
void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPen penR(Qt::red);
    penR.setWidth(2);

    QPoint p1;
    p1.setX(0);
    p1.setY(0);
    QPoint p2;
    p2.setX(170);
    p2.setY(220);

    painter.setPen(penR);
    painter.drawLine(p1,p2);
}
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Сентябрь 29, 2015, 00:00 »

Просто закрашивайте фон в самом начале Dialog::paintEvent, перед тем как рисовать стрелки.

Для отрисовки по времени надо юзать QTimer.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
AndeRVRN
Гость
« Ответ #2 : Сентябрь 29, 2015, 00:07 »

Просто закрашивайте фон в самом начале Dialog::paintEvent, перед тем как рисовать стрелки.

Для отрисовки по времени надо юзать QTimer.
1. А как можно закрасить фон? Функцию такую я не нашел и поэтому сделал альтернативу, просто создал прямоугольник формой окна и залил его нужным цветом.
2. Как вызвать paintEvent из таймера? Т.е. как обратиться к нему из другой функции?
Записан
AndeRVRN
Гость
« Ответ #3 : Сентябрь 29, 2015, 00:32 »

Просто закрашивайте фон в самом начале Dialog::paintEvent, перед тем как рисовать стрелки.

Для отрисовки по времени надо юзать QTimer.
1. А как можно закрасить фон? Функцию такую я не нашел и поэтому сделал альтернативу, просто создал прямоугольник формой окна и залил его нужным цветом.
2. Как вызвать paintEvent из таймера? Т.е. как обратиться к нему из другой функции?

2-ой вопрос решил.
P.S. Не подскажите еще, как можно высчитать координаты поворота секундной стрелки на 6 градусов?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Сентябрь 29, 2015, 00:49 »

1. QPainter::fillRect()
2. Напрямую никак, надо в слоте по таймеру вызывать repaint() для вашего виджета.
3. Можно использовать трансформацию координат, напрмер void QPainter::rotate(qreal angle)
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
AndeRVRN
Гость
« Ответ #5 : Сентябрь 29, 2015, 00:59 »

1. QPainter::fillRect()
2. Напрямую никак, надо в слоте по таймеру вызывать repaint() для вашего виджета.
3. Можно использовать трансформацию координат, напрмер void QPainter::rotate(qreal angle)

Насчет поворота координатной плоскости, пробовал. Поворачивается относительно левого верхнего угла. А мне нужно, чтобы поворачивалось относительно центра. Возможно ли это как-то организовать?
Записан
AndeRVRN
Гость
« Ответ #6 : Сентябрь 29, 2015, 01:50 »

1. QPainter::fillRect()
2. Напрямую никак, надо в слоте по таймеру вызывать repaint() для вашего виджета.
3. Можно использовать трансформацию координат, напрмер void QPainter::rotate(qreal angle)

Насчет поворота координатной плоскости, пробовал. Поворачивается относительно левого верхнего угла. А мне нужно, чтобы поворачивалось относительно центра. Возможно ли это как-то организовать?

Попробовал перенести координатную плоскость с помощью:
Цитировать
painter.translate(this->width() / 2, this->height() / 2);
Но в центр перенеслась не сама координатная плоскость, а весь холст на котором рисую. То есть в принципе ничего не изменилось, просто на форме передвинулось.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Сентябрь 29, 2015, 05:35 »

P.S. Не подскажите еще, как можно высчитать координаты поворота секундной стрелки на 6 градусов?
Код
C++ (Qt)
QPointF ClockPos( const QPointF & cntr, // центр циферблата
                          qreal radius,   // длина стрелки
                          qreal curT,   // текущее время от 0 до 12
{
qreal angle = curT / 12 * M_PI * 2 - M_PI / 2;  // угол поворота от 0 часов в радианах
return QPointF(cntr.x() + radius * cos(angle), cntr.y() + radius * sin(angle));
}
 
А если угол (вместо curT) то переводите его в радианы и отнимаете PI/2
Записан
AndeRVRN
Гость
« Ответ #8 : Сентябрь 29, 2015, 10:20 »

P.S. Не подскажите еще, как можно высчитать координаты поворота секундной стрелки на 6 градусов?
Код
C++ (Qt)
QPointF ClockPos( const QPointF & cntr, // центр циферблата
                          qreal radius,   // длина стрелки
                          qreal curT,   // текущее время от 0 до 12
{
qreal angle = curT / 12 * M_PI * 2 - M_PI / 2;  // угол поворота от 0 часов в радианах
return QPointF(cntr.x() + radius * cos(angle), cntr.y() + radius * sin(angle));
}
 
 
 
А если угол (вместо curT) то переводите его в радианы и отнимаете PI/2

Большое спасибо.
Заработали как часы  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.269 секунд. Запросов: 22.