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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по QGraphicsScene  (Прочитано 4761 раз)
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());
       }
   }
}

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

Буду очень рад помощи!
Записан
Kolobok
Гость
« Ответ #1 : Февраль 24, 2011, 15:32 »

Вызывай родительский mousePressEvent в своем.
Записан
merke
Гость
« Ответ #2 : Февраль 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);
   }
}
Записан
merke
Гость
« Ответ #3 : Февраль 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);
}
 
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Февраль 24, 2011, 18:30 »

Коли перегружаете методы базового класса, надо всегда иметь в виду, что вы можете заломать функционал базового класса.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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