Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: merke от Февраль 24, 2011, 15:23



Название: Вопрос по QGraphicsScene
Отправлено: merke от Февраль 24, 2011, 15:23
Всем привет!

В общем нужно добавить на сцену квадратики, круглишки. И отлавливать клики мыши на данных квадратиках и жмитировать сигнал с
Код:
QGraphicsItem->data(0)

Но получается когда я переопределяю

Код:
virtual void mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent);

То теперь перемещение объекта внутри сцены производится только по двойному клику мышки.

Теперь если переопределяю

Код:
    virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);

То не могу перемащать объекты вообще.

Вот код.

Код
C++ (Qt)
#include <QGraphicsScene>
#include <QGraphicsEllipseItem>
 
class MvScene : public QGraphicsScene
{
   Q_OBJECT
public:
 
   MvScene(QObject *parent = 0);
protected:
   virtual void mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent);
 
signals:
 
   void myName(QString nm);
 
private:
   //void placeBox(float x, float y);
   //QGraphicsItem * itemCollidesWith(QGraphicsItem * item);
 
};
 

Код
C++ (Qt)
#include "mvscene.h"
#include <QGraphicsSceneMouseEvent>
#include <QKeyEvent>
#include <QGraphicsItem>
#include <QtCore>
 
MvScene::MvScene(QObject *parent) : QGraphicsScene(parent)
{
  this->setSceneRect(QRectF(-100,-100,640,480));
}
 
void MvScene::mousePressEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
   if (mouseEvent->button() == Qt::LeftButton)
   {
       QGraphicsItem * item = itemAt(mouseEvent->scenePos());
       if (item)
       {
           emit myName(item->data(0).toString());
       }
   }
}

Как мне заставить при одном клике левой кнопкой емитировать мой сигнал и при этом сохранить возможность перемещать объект при левой зажатой кнопкой?

Буду очень рад помощи!


Название: Re: Вопрос по QGraphicsScene
Отправлено: Kolobok от Февраль 24, 2011, 15:32
Вызывай родительский mousePressEvent в своем.


Название: Re: Вопрос по QGraphicsScene
Отправлено: merke от Февраль 24, 2011, 15:37
т.е. во так? не работает(((

Код
C++ (Qt)
void MvScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
   if (mouseEvent->button() == Qt::LeftButton)
   {
       QGraphicsItem * item = itemAt(mouseEvent->scenePos());
       if (item)
       {
           emit myName(item->data(0).toString());
       }
           mousePressEvent(mouseEvent);
   }
}


Название: Re: Вопрос по QGraphicsScene
Отправлено: merke от Февраль 24, 2011, 15:39
Или вот так? Этот вариант рабочий!) Спасибо за совет!!!

Код
C++ (Qt)
void MvScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
   if (mouseEvent->button() == Qt::LeftButton)
   {
       QGraphicsItem * item = itemAt(mouseEvent->scenePos());
       if (item)
       {
           emit myName(item->data(0).toString());
       }
   }
   QGraphicsScene::mousePressEvent(mouseEvent);
}
 


Название: Re: Вопрос по QGraphicsScene
Отправлено: GreatSnake от Февраль 24, 2011, 18:30
Коли перегружаете методы базового класса, надо всегда иметь в виду, что вы можете заломать функционал базового класса.