Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: CPP11 от Январь 03, 2015, 18:04



Название: клик по QGraphicsPolygonItem
Отправлено: CPP11 от Январь 03, 2015, 18:04
Доброго времени суток, подскажите пожалуйста как обработать клик по QGraphicsPolygonItem?


Название: Re: клик по QGraphicsPolygonItem
Отправлено: gil9red от Январь 03, 2015, 18:58
Можно, например, переопределить методы mouseReleaseEvent (http://qt-project.org/doc/qt-4.8/qgraphicsitem.html#mouseReleaseEvent), mousePressEvent (http://qt-project.org/doc/qt-4.8/qgraphicsitem.html#mousePressEvent), mouseDoubleClickEvent (http://qt-project.org/doc/qt-4.8/qgraphicsitem.html#mouseDoubleClickEvent) и в переопределенных делать нужные вам действия (например, отсылать сигналы).


Название: Re: клик по QGraphicsPolygonItem
Отправлено: CPP11 от Январь 03, 2015, 19:02
Можно, например, переопределить методы mouseReleaseEvent (http://qt-project.org/doc/qt-4.8/qgraphicsitem.html#mouseReleaseEvent), mousePressEvent (http://qt-project.org/doc/qt-4.8/qgraphicsitem.html#mousePressEvent), mouseDoubleClickEvent (http://qt-project.org/doc/qt-4.8/qgraphicsitem.html#mouseDoubleClickEvent) и в переопределенных делать нужные вам действия (например, отсылать сигналы).
Я так и пытался сделать:
Код:
class QGraphicsHexagonItem : public QGraphicsPolygonItem
{
private:
protected:
    void mousePressEvent(QMouseEvent* MouseEvent);
public:
QGraphicsHexagonItem(QPoint center, int radius);
};
однако переопределённый mousePressEvent никогда не вызывается.


Название: Re: клик по QGraphicsPolygonItem
Отправлено: gil9red от Январь 03, 2015, 19:07
покажите исходник :)


Название: Re: клик по QGraphicsPolygonItem
Отправлено: CPP11 от Январь 03, 2015, 19:14
покажите исходник :)
QGraphicsHexagonItem.h
Код:
#ifndef __QGRAPHICSHEXAGONITEM_H__
#define __QGRAPHICSHEXAGONITEM_H__

#include <QObject>
#include <QGraphicsPolygonItem>
#include <QPen>
#include <QMouseEvent>

class QGraphicsHexagonItem : public QGraphicsPolygonItem
{
private:
protected:
void mousePressEvent(QMouseEvent* MouseEvent);
public:
QGraphicsHexagonItem(QPoint center, int radius);
};

#endif
QGraphicsHexagonItem.h
Код:
#include "QGraphicsHexagonItem.h"

QGraphicsHexagonItem::QGraphicsHexagonItem(QPoint center, int radius)
{
QVector<QPoint> vector;
int R = radius;
int r = R*sqrt(3.0)/2;

QPen pen;
pen.setWidthF(2.5);

vector.push_back(QPoint(center.x(), center.y()-R));
vector.push_back(QPoint(center.x()+r, center.y()-r/2));
vector.push_back(QPoint(center.x()+r, center.y()+r/2));
vector.push_back(QPoint(center.x(), center.y()+R));
vector.push_back(QPoint(center.x()-r, center.y()+r/2));
vector.push_back(QPoint(center.x()-r, center.y()-r/2));

this->setPolygon(QPolygon(vector));
this->setPen(pen);
this->setBrush(QBrush(Qt::green));
}

void QGraphicsHexagonItem::mousePressEvent(QMouseEvent* MouseEvent)
{
//...
}
ну и эти гексы рисуются при инициализации приложения в QGraphicsView:
Код:
QGraphicsScene* scene = new QGraphicsScene(this);
int width = 580;
int height = 310;
int space = 5;
scene->setSceneRect(0, 0, width-2, height-2);
int R = 15;
int r = R*sqrt(3.0)/2;
QPoint center(space+r, space+R);

QPen pen;
pen.setWidthF(2.5);

bool t = false;
for(int x, y=0;center.y()+R<=height-2-space;center.setY(center.y()+R+r/2),t=!t,++y)
{
x=0;
for(center.setX(space+r+(t?r:0));center.x()+r<=width-2-space;center.setX(center.x()+r+r),++x)
scene->addItem(new QGraphicsHexagonItem(center, R));
}

QGraphicsView* view = new QGraphicsView(scene, this);
view->setGeometry(10, 50, width, height);
view->show();


Название: Re: клик по QGraphicsPolygonItem
Отправлено: gil9red от Январь 03, 2015, 19:50
В mousePressEvent вызываете метод предка?


Название: Re: клик по QGraphicsPolygonItem
Отправлено: CPP11 от Январь 03, 2015, 20:10
В mousePressEvent вызываете метод предка?
нет, там только брейкпоинт, который никогда не отрабатывает.


Название: Re: клик по QGraphicsPolygonItem
Отправлено: gil9red от Январь 03, 2015, 21:05
Метод предка всегда при переопределении нужно вызывать


Название: Re: клик по QGraphicsPolygonItem
Отправлено: CPP11 от Январь 03, 2015, 21:11
Метод предка всегда при переопределении нужно вызывать
дык не вызывается переопределённый метод, стало быть чего бы я в нём не городил это тоже не выполнится.


Название: Re: клик по QGraphicsPolygonItem
Отправлено: gil9red от Январь 03, 2015, 21:35
Давайте минимальный компилябельный проект :)


Название: Re: клик по QGraphicsPolygonItem
Отправлено: CPP11 от Январь 03, 2015, 21:57
Давайте минимальный компилябельный проект :)
Весь код уже приведён, прикрепляю проект в VS2010, но там только уже приведённый код и автоматически сгенерированный средой.


Название: Re: клик по QGraphicsPolygonItem
Отправлено: gil9red от Январь 03, 2015, 22:51
Интересно выглядит у вас :)

Нашел причину: тип параметра в методе-событии должен быть QGraphicsSceneMouseEvent :)

Так сразу и не обратишь на это внимания, глядя на исходники :)


Название: Re: клик по QGraphicsPolygonItem
Отправлено: CPP11 от Январь 03, 2015, 23:35
Нашел причину: тип метода-события должен быть QGraphicsSceneMouseEvent :)
Точно, спасибо! Сложноотыскиваемый косяк получился :( .