Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: ecspertiza от Сентябрь 11, 2009, 10:15



Название: Прорисовка выделения
Отправлено: ecspertiza от Сентябрь 11, 2009, 10:15
Хочу организовать в своей софтине, выделение нескольких объектов как на рабочем столе в винде, всё бы нечего но вот с рисованием проблема, я понимаю что нужно нарисовать обычный прямоугольник, но возникают трудности даже с обычным рисованием (с лева на право, с верху в низ), проблемы такие что координаты мыши и прямоугольника не совподают, может я гдето косячу, в аттаче минимальный пример.


Название: Re: Прорисовка выделения
Отправлено: ufna от Сентябрь 11, 2009, 10:22
посмотрел. Зависимость не видишь почему так рисуется? :)

QRect задается не координатами углов, а левым верхним углом и шириной и высотой, потому
rect = QRect(startPosition.x(),startPosition.y(),event->pos().x(),event->pos().y());
это неправильно.

вот так все работает:
Код
C++ (Qt)
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
   stopPosition = event->pos();
   //rect = QRect(startPosition.x(),startPosition.y(),event->pos().x(),event->pos().y());
   rect.setTopLeft(startPosition);
   rect.setBottomRight(stopPosition);
   update();
}
 
void MainWindow::paintEvent(QPaintEvent *event)
{
   qDebug() << "painter" << startPosition << stopPosition;
 
   QPainter painter(this);
   QPen pen;
   pen.setColor(Qt::blue);
   pen.setWidth(1);
   painter.setPen(pen);
   painter.setBrush(QBrush(Qt::blue));
   painter.setOpacity(0.5);
 
//    if (stopPosition.x() < startPosition.x())
//    ...............................................................
//    }else
       painter.drawRect(rect);
 
   pen.setColor(Qt::black);
   pen.setWidth(6);


Название: Re: Прорисовка выделения
Отправлено: ecspertiza от Сентябрь 11, 2009, 10:30
Да я уже сам понял где накосчяил, я рисовал прямоуголиник по четырём координатам,
а он рисуется по двум координатом, ширине и высоте, слона то я и незаметил, даже стыдно, пойду в угол стану :)

Спасибо за помошь :)


Название: Re: Прорисовка выделения
Отправлено: Vexator от Сентябрь 24, 2009, 04:59
нубский вопрос в тему
есть у меня QWidget, который занимается отловом ввода пользователя :)
и есть задача, организовать рисование выделения (рамочку т.е.), что бы она тянулась с места нажатия, за курсором мышки.

посмотрел асистент, вроде все просто, юзаем 3 методы:
mousePressEvent
mouseReleaseEvent
ну и mouseMoveEvent


для начала просто повесил на все три методы qWarning()
и отчего то, метод mouseMoveEvent никогда не вызывается, только press и release ... может я какого нюанса про mouseMove не знаю?


Название: Re: Прорисовка выделения
Отправлено: CroCIV от Сентябрь 24, 2009, 07:38
мб ты ошибся в сигнатуре функции при ее обьявлении?
у меня моусМувЕвент работает как положено.


Название: Re: Прорисовка выделения
Отправлено: BRE от Сентябрь 24, 2009, 07:50
может я какого нюанса про mouseMove не знаю?
Посмотри на void QWidget::setMouseTracking ( bool enable )


Название: Re: Прорисовка выделения
Отправлено: Makss от Сентябрь 24, 2009, 07:51
setMouseTracking(true);
тогда будешь ловить событие движения мышки всегда, а так она ловится тока если ты нажмёшь мышку а потом будешь двигать)

хы)пока писал уже ответили))


Название: Re: Прорисовка выделения
Отправлено: Vexator от Сентябрь 24, 2009, 10:06
вообщем буду копать, мне собственно и нужно что бы оно отлавливалось при зажатой кнопке, но событие не происходит... попробую с трекингом :)


Название: Re: Прорисовка выделения
Отправлено: ecspertiza от Сентябрь 24, 2009, 13:44
Я походу занимался тойже темой что и тебе сейчас нужно, вот здесь есть пример http://www.rapidshare.ru/1173266 можешь глянуть.