Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: daimon от Декабрь 04, 2011, 21:19



Название: своё событие QEvent QGraphicsItem
Отправлено: daimon от Декабрь 04, 2011, 21:19
есть шар (QGraphicsEllipseItem), на нём текст (QGraphicTextItem), возможность выделения и перемещения для текста выключил, так как не смог перемещать из-за этого шар при попадании на текст.
для редактирования текста придумал двойной клип мыши на тексте.

основная проблема - заставить срабатывать событие двойного нажатия кнопки мыши без переопределения события mousePressEvent(...) в классе текста

проблема состоит в том, что, когда мышь попадает под текст, то срабатывает mousePressEvent и я не могу захватывать шар и двигать- а мне нужно двигать всегда, если захват прошёл по всему rect шара, для этого я хочу обрабатывать только двойной клик (для редактирования текста)


самый тупой вариант сделать public mouseDoubleClickEvent в классе текста и вызывать его в событии двойного нажатия мыши в классе шара - просто перенаправить объект события, но логичней бы было отправлять двойной клик в этой же функции объекту текста (qApp->sendEvent(...)) - но как пишет QAssist это невозможно - нужен свой mousePressEvent в классе текста

думаю самый логичный вывод из этого всего - свой класс события - двойной клик, ну и его программно создавать потом в функции mouseDoubleClickEvent класса шара и отправлять его классу текста (sendEvent()), но тут другая беда как текст сможет обработать мой класс события


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

пробую так

Код
C++ (Qt)
void Node::mouseDoubleClickEvent( QGraphicsSceneMouseEvent *event )
{
   qDebug()<<"clickNode";
 
QEvent * my = new QEvent (QEvent::Type::User);
 
   if(graph->scene()->mouseGrabberItem() == m_textItem)
 
       qApp->sendEvent(m_textItem,my);
 
   QGraphicsEllipseItem::mouseDoubleClickEvent(event);
}
 
//////////////////TextItem
 
bool sceneEvent(QEvent * event)
{
 
if(event->type() ==   QEvent::Type::User )
    setPlainText("ssssssssssss");
 
qDebug()<<event->type();
return QGraphicsTextItem::sceneEvent(event);
}
 
 

почему-то событие типа User=1000 не принимается объектом текста, хотя sendEvent() срабатывает у Node
что не так?


Название: Re: своё событие QEvent QGraphicsItem
Отправлено: artiom_kh от Март 02, 2012, 12:28
в классе своего текстового айтема (унаследованного от QGraphicTextItem) сделай так: http://www.prog.org.ru/index.php?topic=20748.msg145092#msg145092 (http://www.prog.org.ru/index.php?topic=20748.msg145092#msg145092), даблклик пусть обрабатывает шарик (QGraphicsEllipseItem) и запускает редактирование текстового айтема