Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: jerdeks от Сентябрь 13, 2011, 16:57



Название: Неадекватно работает QGraphicsItem::contains
Отправлено: jerdeks от Сентябрь 13, 2011, 16:57
Есть главные айтем - main_item. На нем лежат остальные объекты. Хочу их перетаскивать. Функции itemAt недостаточно, потому что она определяет не точную границу фигуры, а прямоугольник, в который она вписана. Ну то есть элипс например таскается за несуществующий угол. Функция contains определяет границы правильно, но иногда возвращает false, даже если тыкаю явно в центр фигуры 0_о Собственно, в этом вся проблема - то таскаются айтемы, то нет. Объясните, что я не так делаю, пожалуйста :)
lockScene - чтобы таскать main_item, собственно для вопроса это не нужно

Код
C++ (Qt)
void MyScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent) {
   switch (mouseEvent->button()) {
   case Qt::LeftButton :
       if ((curItem = itemAt(mouseEvent->scenePos())) &&
           curItem->contains(mouseEvent->scenePos()) &&
           curItem != view->main_item)
           lockCurItem = true;
       lockScene = !lockCurItem;
       break;
   }
}
 

А, да. view это static_cast<QGraphicsView*>(this->parent)


Название: Re: Неадекватно работает QGraphicsItem::contains
Отправлено: iroln от Октябрь 07, 2011, 23:02
Код:
QList<QGraphicsItem *> QGraphicsScene::items ( const QPointF & pos, Qt::ItemSelectionMode mode, Qt::SortOrder order, const QTransform & deviceTransform = QTransform() ) const

Флаг ItemSelectionMode устанавливаете в ContainsItemShape

Единственное, этот метод возвращает список элементов. Надо потом из списка выбрать (найти) нужный. И ещё он для сцены, то есть надо делать преобразование координат pos в координаты сцены если pos в координатах вида.