Russian Qt Forum

Qt => Вопросы новичков => Тема начата: AndeRVRN от Сентябрь 28, 2015, 23:52



Название: Работа с Qt Painter
Отправлено: 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);
}


Название: Re: Работа с Qt Painter
Отправлено: Racheengel от Сентябрь 29, 2015, 00:00
Просто закрашивайте фон в самом начале Dialog::paintEvent, перед тем как рисовать стрелки.

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


Название: Re: Работа с Qt Painter
Отправлено: AndeRVRN от Сентябрь 29, 2015, 00:07
Просто закрашивайте фон в самом начале Dialog::paintEvent, перед тем как рисовать стрелки.

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


Название: Re: Работа с Qt Painter
Отправлено: AndeRVRN от Сентябрь 29, 2015, 00:32
Просто закрашивайте фон в самом начале Dialog::paintEvent, перед тем как рисовать стрелки.

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

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


Название: Re: Работа с Qt Painter
Отправлено: Racheengel от Сентябрь 29, 2015, 00:49
1. QPainter::fillRect()
2. Напрямую никак, надо в слоте по таймеру вызывать repaint() для вашего виджета.
3. Можно использовать трансформацию координат, напрмер void QPainter::rotate(qreal angle)


Название: Re: Работа с Qt Painter
Отправлено: AndeRVRN от Сентябрь 29, 2015, 00:59
1. QPainter::fillRect()
2. Напрямую никак, надо в слоте по таймеру вызывать repaint() для вашего виджета.
3. Можно использовать трансформацию координат, напрмер void QPainter::rotate(qreal angle)

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


Название: Re: Работа с Qt Painter
Отправлено: AndeRVRN от Сентябрь 29, 2015, 01:50
1. QPainter::fillRect()
2. Напрямую никак, надо в слоте по таймеру вызывать repaint() для вашего виджета.
3. Можно использовать трансформацию координат, напрмер void QPainter::rotate(qreal angle)

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

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


Название: Re: Работа с Qt Painter
Отправлено: Igors от Сентябрь 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


Название: Re: Работа с Qt Painter
Отправлено: AndeRVRN от Сентябрь 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

Большое спасибо.
Заработали как часы  :)