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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsItemGroup, QGraphicsItem  (Прочитано 4051 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« : Июнь 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)

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

« Последнее редактирование: Июнь 01, 2022, 19:20 от demaker » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июнь 01, 2022, 17:07 »

- вы зодойоте вопросы по коду?
- нет, только показываю
- красивое...
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #2 : Июнь 01, 2022, 19:02 »

- вы зодойоте вопросы по коду?
- нет, только показываю
- красивое...

Описал как должно работать.
Показал реализацию как у меня написано. Строит глазки
Не работает, не могу понять почему...
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Июнь 02, 2022, 14:49 »

думаю, все дело в том, что группа — это тоже айтем, поэтому она и получает сигнал, а дальше надо уже руками определять нужный айтем внутри группы (что просто, ведь все координаты известны).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
demaker
Птица говорун
*****
Offline Offline

Сообщений: 962


Просмотр профиля
« Ответ #4 : Июнь 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);
}
 

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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