QGraphicsItem mouse Press event return
-
Hi all,
I am stuck at a peace of coding.
I have created two square's using QRectF in a QGraphicsview.
What i am trying to do is when a square is pressed a label outside the QGraphicsview shows a identification item of that square.
so if I press the right square it sets the label to "2 or right or 1234".
My square.CPP is
@#include "square.h"Square::Square(int x, int y)
{
X= x;
Y= y;
Pressed = false;
setFlag(ItemIsSelectable);
}QRectF Square::boundingRect() const
{
return QRectF(X,Y,100,100);}
void Square::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{QRectF rec = boundingRect(); QBrush brush(Qt::blue); if(Pressed)
{
brush.setColor(Qt::red);
}
else
{
brush.setColor(Qt::green);
}painter->fillRect(rec,brush); painter->drawRect(rec);
}
void Square::mousePressEvent(QGraphicsSceneMouseEvent *event)
{Pressed = true; update(); QGraphicsItem::mousePressEvent(event);
}
void Square::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
Pressed = false;
update();
QGraphicsItem::mouseReleaseEvent(event);
}@my mainwindow.ccp is.
@#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "square.h"
#include <QString>
#include <QtGui>
#include <QtCore>
#include <QObject>MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);scene = new QGraphicsScene(this); ui->graphicsView->setScene(scene); sq = new Square(0,0); scene->addItem(sq); sq = new Square(100,0); scene->addItem(sq);
}
MainWindow::~MainWindow()
{
delete ui;
}//void MainWindow::setLabel(QString value)
//{
// ui->label->setText(value);
//}
@ -
Hi there,
I see you're implementing your own "square" class. If you want something to happen everytime one of them is picked up, you may want to declare that class as a Q_OBJECT instead of just a plain C++ class. That will allow you to write signals for that object, and if you connect that signal to a slot on your main class, you will be able to detect stuff on your square class, like mouse picking. Then, it's only a matter of setting your label text to what you want to show.
That's an overview of how it could be done and how I would try to solve it.
If you're not familiar with Qt Objects, you may want to look at the docs.Tell us what you did :)
-
HI thanx for the replay.
It got me thinking and solved it in a way :).
As far did I only added singles that can be emitted white parameters.
is there some ware a list of mouse events that i can use for a QGraphicsItem.
Like :
right mouse button pressed.
moved into QGraphicsItem.
moved out QGraphicsItem.so this is my square.cpp now
@#include "square.h"
square::square(int x, int y, QGraphicsObject *parent) :
QGraphicsObject(parent)
{
Pressed = false;
setFlag(ItemIsSelectable);
X = x;
Y = y;}
QRectF square::boundingRect() const
{
return QRectF(X,Y,30,30);
}void square::mousePressEvent(QGraphicsSceneMouseEvent *ev)
{
Pressed = true;
update();
QGraphicsItem::mousePressEvent(ev);
emit Mouse_Pressed(X,Y);
}void square::mouseReleaseEvent(QGraphicsSceneMouseEvent *ev)
{
Pressed = false;
update();
QGraphicsItem::mousePressEvent(ev);
emit Mouse_Released(X,Y);
}void square::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QRectF rec = boundingRect();
QBrush brush(Qt::blue);
if(Pressed)
{
brush.setColor(Qt::red);
}
else
{
brush.setColor(Qt::blue);
}painter->fillRect(rec,brush); painter->drawRect(rec);
}@
and mij Dialog.cpp looks like.
@#include "dialog.h"
#include "ui_dialog.h"
#include "square.h"
#include <QLabel>Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
scene = new QGraphicsScene(this);
ui->graphicsView->setScene(scene);
LineCounter = 0;
for (int i = 0; i < 25; ++i) {if (i==0){ Hoog = i*30; } else { Hoog = Hoog +30; } if (LineCounter == 5){ links = links+30; Hoog = 0; LineCounter = 1; } else{ LineCounter = LineCounter +1; } sq = new square(links,Hoog); scene->addItem(sq); connect(sq,SIGNAL(Mouse_Pressed(int,int)),this,SLOT(Mouse_Pressed(int,int))); connect(sq,SIGNAL(Mouse_Released(int,int)),this,SLOT(Mouse_Released(int,int))); }
}
Dialog::~Dialog()
{
delete ui;
}void Dialog::Mouse_Pressed(int x,int y)
{
ui->label->setText(QString("Pressed X= %1, Y= %2 ").arg(x).arg(y));}
void Dialog::Mouse_Released(int x, int y)
{
ui->label->setText(QString("Released X= %1, Y= %2 ").arg(x).arg(y));
}@