Russian Qt Forum
Июля 08, 2025, 07:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как определить клик мышки по объекту с углом?  (Прочитано 5287 раз)
alex-v
Гость
« : Июня 03, 2011, 15:32 »

Добрый день!
Ситуация такова. Рисуем картинку на QWidget размером 30х60 под углом 40% (с помощью QPainter::rotate). Потом кликаем мышкой по этому QWidget. И как можно определить: относится ли точка клика к нарисованной под углом картинке или к пустому фону?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Июня 03, 2011, 16:46 »

Заведи у себя QPolygon c такими же размерами и поверни его:
Код
C++ (Qt)
QPoint topleft( 0, 0 );        // top left picture offset
QPolygon pl( QRect( topleft, QSize( 30, 60 ) ), true );
QMatrix m;
m.rotate( 40 );
pl = m.map( pl );
 

В mousePressEvent() проверяешь границы:
Код
C++ (Qt)
if( pl.containsPoint( event->pos() ) )
 ....
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июня 03, 2011, 16:47 »

Код
C++ (Qt)
inline bool PtInsideRotatedRect( const QRect & R, float angle_radians, QPoint pt )
{
pt -= R.center();
qreal x = cos(angle_radians), y = sin(angle_radians);
qreal px = pt.x(), py = pt.y();
qreal rel_x = px * x + py * y;
qreal rel_y = px * y - py * x;
qreal w2 = R.width() * 0.5f;
qreal h2 = R.height() * 0.5f;
return fabs(rel_x) <= w2 && fabs(rel_y) <= h2;
}
 
« Последнее редактирование: Июня 04, 2011, 00:54 от Igors » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Июня 03, 2011, 16:52 »

2 Igors:
Qt малость развращает - знание тригонометрии необязятельно Улыбающийся
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июня 03, 2011, 16:56 »

2 Igors:
Qt малость развращает - знание тригонометрии необязятельно Улыбающийся
Да понятно что "удобно", но елы-палы, тут же просто теорема Пифагора  Улыбающийся
Записан
alex-v
Гость
« Ответ #5 : Июня 03, 2011, 17:00 »

Спасибо большое.

p.s. Математика вещь полезная, но красивый код тоже хорошо. Улыбающийся
Удачи!
Записан
alex-v
Гость
« Ответ #6 : Июня 03, 2011, 19:22 »

Еще вопросик возник.
rotate вращает изображение вокруг точки (0;0). А как сделать поворот картинки относительно его центральной точки.
Т.е. если у меня изображение размером 30х60, то его центральная точка будет (15;30). Вот как повернуть картинку относительно этой точки, а не как по умолчанию (0;0)?
Спасибо.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Июня 03, 2011, 19:38 »

>>rotate вращает изображение вокруг точки (0;0).
о каком конкретно методе речь идёт? (к какому класу относится?)
Записан

Юра.
alex-v
Гость
« Ответ #8 : Июня 03, 2011, 19:42 »

>>rotate вращает изображение вокруг точки (0;0).
о каком конкретно методе речь идёт? (к какому класу относится?)

QPainter и QMatrix - без разницы
Записан
alex-v
Гость
« Ответ #9 : Июня 03, 2011, 20:16 »

решение нашел на основании темы http://www.prog.org.ru/topic_2102_0.html
сейчас подготовлю код и вылажу. момент...
Записан
alex-v
Гость
« Ответ #10 : Июня 03, 2011, 20:30 »

Код
C++ (Qt)
#include "UiMainWindow.h"
#include "ui_UiMainWindow.h"
 
UiMainWindow::UiMainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::UiMainWindow)
{
   ui->setupUi(this);
 
   // здесь картинку можно выбрать по вкусу
   _img = QImage(QString::fromUtf8("e:\\Картинки\\1\\Daddy-Bliss.jpg")).scaled(60, 80);
 
   _angle = 0;
 
   connect(&_timer, SIGNAL(timeout()), this, SLOT(timerTick()));
   _timer.setInterval(10);
   _timer.start();
}
 
UiMainWindow::~UiMainWindow()
{
   delete ui;
}
 
void UiMainWindow::timerTick()
{
   repaint();
 
   _angle++;
 
   if (_angle >= 360)
       _angle = 0;
}
 
void UiMainWindow::paintEvent(QPaintEvent *event)
{
   QPainter p(this);
 
   QPoint c = rect().center();
 
   QMatrix wm1;
   wm1.translate( -c.x(), -c.y() );
   QMatrix wm2;
   wm2.rotate( -_angle );
   QMatrix wm3;
   wm3.translate( c.x(), c.y() );
 
   p.save();
   p.setMatrix( wm1 * wm2 * wm3 );
   p.drawImage(c-_img.rect().center(), _img);
   p.restore();
 
   p.drawLine(0,c.y(),width(),c.y());
   p.drawLine(c.x(),0,c.x(),height());
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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