Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: demaker от Июнь 01, 2022, 17:01



Название: QGraphicsItemGroup, QGraphicsItem
Отправлено: demaker от Июнь 01, 2022, 17:01
Добрый день!

Рисую таблицу(QGraphicsItemGroup), каждую ячейку представляю отдельным элементом(QGraphicsItem).
Соответственно таблицу  добавляю в сцену(QGraphicsScene), ну а сцену отображаю через вьюху(QGraphicsView)


У каждой ячейки таблицы есть свой номер и хотелось по нажатию на ячейку отображать ее номер в консоли.
Т.е событие нажатия пробрасывается view ->scene->itemgroup->item
Но не получается достучаться до ячейки...
Не получается прокинуть сигнал до QGraphicsItem через QGraphicsItemGroup

View
Код
C++ (Qt)
void View::mousePressEvent(QMouseEvent *event)
{
   event->ignore();
   qDebug() << "View " << event->pos();
   QGraphicsView::mousePressEvent(event);
}
 

Scene
Код
C++ (Qt)
Scene::Scene(QObject *parent) : QGraphicsScene(parent)
{
   addItem(&table);
}
 
void Scene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
   qDebug() << "Scene" << event->scenePos();
   QGraphicsScene::mousePressEvent(event);
}
 

QGraphicsItemGroup
Код
C++ (Qt)
Table::Table(QGraphicsItem * parent) : QGraphicsItemGroup(parent)
{
   int k = 0;
   for(int i =  0; i < 3; i++){
       for(int j = 0; j < 3; j++){
 
           addToGroup(&cells[i][j]);
           cells[i][j].setPos(0 + i * cells[i][j].boundingRect().width(),
                           0 + j * cells[i][j].boundingRect().height()
                           );
 
           cells[i][j].setnum(k++);
           cells[i][j].setParentItem(this);
       }
   }
}
 
void Table::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
   event->ignore();
   qDebug() << "Table" << event->pos();
   QGraphicsItemGroup::mousePressEvent(event);
}
 

QGraphicsItem
Код
C++ (Qt)
Cell::Cell(QGraphicsItem * parent) : QGraphicsItem(parent)
{
   number = 0;
}
 
void Cell::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
   Q_UNUSED(option)
   Q_UNUSED(widget)
 
   painter->drawRect(0, 0, 40, 40);
   painter->drawText(boundingRect() , QString("cell %1").arg(number, 0, 10));
}
 
QRectF Cell::boundingRect() const
{
   return QRectF(0, 0, 40, 40);
}
 
void Cell::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
   qDebug() << number;
}
 

При нажатии в консоль сваливается только такой вывод:
Код:
View  QPoint(250,227)
Scene QPointF(184, 203)
Table QPointF(84, 103)
Table QPointF(84, 103)

Подскажите что делаю не так???



Название: Re: QGraphicsItemGroup, QGraphicsItem
Отправлено: kambala от Июнь 01, 2022, 17:07
- вы зодойоте вопросы по коду?
- нет, только показываю
- красивое...


Название: Re: QGraphicsItemGroup, QGraphicsItem
Отправлено: demaker от Июнь 01, 2022, 19:02
- вы зодойоте вопросы по коду?
- нет, только показываю
- красивое...

Описал как должно работать.
Показал реализацию как у меня написано. ::)
Не работает, не могу понять почему...


Название: Re: QGraphicsItemGroup, QGraphicsItem
Отправлено: kambala от Июнь 02, 2022, 14:49
думаю, все дело в том, что группа — это тоже айтем, поэтому она и получает сигнал, а дальше надо уже руками определять нужный айтем внутри группы (что просто, ведь все координаты известны).


Название: Re: QGraphicsItemGroup, QGraphicsItem
Отправлено: demaker от Июнь 02, 2022, 15:52
думаю, все дело в том, что группа — это тоже айтем, поэтому она и получает сигнал, а дальше надо уже руками определять нужный айтем внутри группы (что просто, ведь все координаты известны).

Сделал так:
Код
C++ (Qt)
void Table::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
 
   //НО ЭТО НЕ ОЧЕНЬ ХОРОШО !!!
   Cell * cell = reinterpret_cast<Cell * >(scene()->itemAt(event->scenePos().rx(), event->scenePos().ry()));
   //
 
   qDebug() << cell->getnumber();
   QGraphicsItemGroup::mousePressEvent(event);
}