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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по QGraphicsItem::boundingRect() и отрисовке элемента  (Прочитано 5723 раз)
Martiro
Гость
« : Январь 14, 2013, 09:26 »

Разъясните мне, пожалуйста, какую конкретную роль выполняет функция boundingRect(). А то я уже запутался.
Я правильно понял, что она определяет область для перерисовки, плюс "активную" область, которая реагирует на "столкновения", события мыши и т.д.?
Тогда по ходу дела вопрос. Возможно ли определить область не как прямоугольник, а как произвольную область (взять хотя бы даже круг)? Мне не нужны события вне этой области, которая вписана в прямоугольник. Мне нужны события которые происходят внутри контура, нарисованного в функции paint().
Вот мой пример.
Отрисовка объекта:
Код
C++ (Qt)
class sectorDouble : public QGraphicsItem {
private:
   int iSideLength;
   int iSecType;
public:
   QString Scores;
   bool red;
   sectorDouble(QGraphicsItem * parent = 0, int iSecNumb = 0, int iSideLen = 50, int iScore = 0)
   {
       iSideLength = iSideLen;
       red = false;
       iSecType = 0;
   }
   virtual QRectF boundingRect() const
   {
       return QRectF(0,0,iSideLength,iSideLength);
   }
   virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
   {
       QPainterPath path;
 
       qreal side = (iSideLength/2)-(iSideLength/100)*10;
       qreal gipo = (iSideLength/2)-(iSideLength/100)*13;
       path.moveTo(gipo,0);
       path.arcTo(-side,-side,side*2,side*2,0,-18);
       path.lineTo(cos(M_PI/10)*gipo,sin(M_PI/10)*gipo);
       path.moveTo(gipo,0);
       path.arcTo(-gipo,-gipo,gipo*2,gipo*2,0,-18);
 
       path.closeSubpath();
 
       painter->setRenderHint(QPainter::Antialiasing,true);
       switch (iSecType) {
               case 0: painter->setPen(QPen(Qt::black, 1));
                   break;
               case 1: painter->setPen(QPen(Qt::darkYellow,1));
                   break;
               case 2: painter->setPen(QPen(Qt::red,1));
                   break;
               case 3: painter->setPen(QPen(Qt::darkYellow,1));
                   break;
               default: painter->setPen(QPen(Qt::black, 1));
                   break;
               }
 
        if (red) painter->setBrush(QBrush(Qt::red));
          else
        painter->setBrush(QBrush(Qt::green));
 
        painter->drawPath(path);
   }
   virtual void mousePressEvent(QGraphicsSceneMouseEvent *event)
   {
       iSecType = 2;
       update(0,0,iSideLength, iSideLength);
   }
 
   virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
   {
       if (event->type() == QEvent::GraphicsSceneHoverMove)
       {
           iSecType = 1;
       }
 
       if (event->type() == QEvent::GraphicsSceneHoverLeave)
       {
           iSecType = 0;
       }
 
       update(0,0,iSideLength, iSideLength);
   }
 
   virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
   {
       iSecType = 3;
       update(0,0,iSideLength, iSideLength);
   }
 
};

Вызов отрисовки элемента (класс MainScene унаследован от QGraphicsScene):
Код
C++ (Qt)
MainScene::MainScene()
{
 int iSide = 200;
 
 sectorDouble* scd = new sectorDouble(0,0,iSide,0);
 addItem(scd);
 scd->translate(qX,qY);
 scd->rotate(angle);
}
Результат я схематично привел во вложении. Фиолетовым цветом я показал область, которая в данном случае отзывается на события. Понятно, что ее можно "сузить". Но всё равно она будет прямоугольной, а хотелось бы её точного совпадения с красной областью.
И еще. Элемент почему-то рисуется с нижней горизонтальной линией. Это такая особенность функции arcTo()? Как от нее избавиться?
« Последнее редактирование: Январь 14, 2013, 09:30 от Martiro » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Январь 14, 2013, 09:29 »

Тогда по ходу дела вопрос. Возможно ли определить область не как прямоугольник, а как произвольную область (взять хотя бы даже круг)?
QPainterPath QGraphicsItem::shape () const [virtual]
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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