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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: клик по QGraphicsPolygonItem  (Прочитано 6687 раз)
CPP11
Гость
« : Январь 03, 2015, 18:04 »

Доброго времени суток, подскажите пожалуйста как обработать клик по QGraphicsPolygonItem?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Январь 03, 2015, 18:58 »

Можно, например, переопределить методы mouseReleaseEvent, mousePressEvent, mouseDoubleClickEvent и в переопределенных делать нужные вам действия (например, отсылать сигналы).
Записан

CPP11
Гость
« Ответ #2 : Январь 03, 2015, 19:02 »

Можно, например, переопределить методы mouseReleaseEvent, mousePressEvent, mouseDoubleClickEvent и в переопределенных делать нужные вам действия (например, отсылать сигналы).
Я так и пытался сделать:
Код:
class QGraphicsHexagonItem : public QGraphicsPolygonItem
{
private:
protected:
    void mousePressEvent(QMouseEvent* MouseEvent);
public:
QGraphicsHexagonItem(QPoint center, int radius);
};
однако переопределённый mousePressEvent никогда не вызывается.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Январь 03, 2015, 19:07 »

покажите исходник Улыбающийся
Записан

CPP11
Гость
« Ответ #4 : Январь 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();
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Январь 03, 2015, 19:50 »

В mousePressEvent вызываете метод предка?
Записан

CPP11
Гость
« Ответ #6 : Январь 03, 2015, 20:10 »

В mousePressEvent вызываете метод предка?
нет, там только брейкпоинт, который никогда не отрабатывает.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #7 : Январь 03, 2015, 21:05 »

Метод предка всегда при переопределении нужно вызывать
Записан

CPP11
Гость
« Ответ #8 : Январь 03, 2015, 21:11 »

Метод предка всегда при переопределении нужно вызывать
дык не вызывается переопределённый метод, стало быть чего бы я в нём не городил это тоже не выполнится.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #9 : Январь 03, 2015, 21:35 »

Давайте минимальный компилябельный проект Улыбающийся
Записан

CPP11
Гость
« Ответ #10 : Январь 03, 2015, 21:57 »

Давайте минимальный компилябельный проект Улыбающийся
Весь код уже приведён, прикрепляю проект в VS2010, но там только уже приведённый код и автоматически сгенерированный средой.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #11 : Январь 03, 2015, 22:51 »

Интересно выглядит у вас Улыбающийся

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

Так сразу и не обратишь на это внимания, глядя на исходники Улыбающийся
« Последнее редактирование: Январь 03, 2015, 23:42 от gil9red » Записан

CPP11
Гость
« Ответ #12 : Январь 03, 2015, 23:35 »

Нашел причину: тип метода-события должен быть QGraphicsSceneMouseEvent Улыбающийся
Точно, спасибо! Сложноотыскиваемый косяк получился Грустный .
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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