Разъясните мне, пожалуйста, какую конкретную роль выполняет функция
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()? Как от нее избавиться?