Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: kdm от Январь 29, 2011, 05:04



Название: перемещение айтемов мышкой в QGraphicsView
Отправлено: kdm от Январь 29, 2011, 05:04
Подскажите, как правильно перемещать айтемы внутри QGraphicsView мышкой. Смотрел примеры Qt, но там много кода, выполняющего разные действия, где что не подсек. Какой правильный подход? Раньше таких задач еще не делал.


Название: Re: перемещение айтемов мышкой в QGraphicsView
Отправлено: Mikhail от Январь 29, 2011, 09:49
Установи у них флаги выделения и перемещения.

    setFlag(QGraphicsItem::ItemIsMovable, true);
    setFlag(QGraphicsItem::ItemIsSelectable, true);


Название: Re: перемещение айтемов мышкой в QGraphicsView
Отправлено: kdm от Февраль 20, 2011, 19:56
Все работает. Сейчас уже пишу другую программу, в которой требуется тоже самое. Но сейчас айтемы выделяются, но не двигаются, в чем может быть дело?

Код:
void MainWindow :: addItem ()
{
    QGraphicsPixmapItem* GraphicsItem;
    GraphicsItem =
scene()->addPixmap(QPixmap("Pixmaps/Dialog/image.png"));
   
    GraphicsItem->setFlag(QGraphicsItem::ItemIsMovable, true);
    GraphicsItem->setFlag(QGraphicsItem::ItemIsSelectable, true);
}
Все происходит в MainWindow (class MainWindow : public QGraphicsView).
Из отличительных особенностей от той программы (в которой все работало) есть только то, что MouseTracking включен и определен метод void mouseMove(QMouseEvent*). Хотя как это может сказаться? ??? Ничего ни с GraphicsView ни GraphicsScene не делаю. Все что касается их в конструкторе MainWindow ():
Код:
    setScene(new QGraphicsScene(this));
    setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    setMouseTracking(true);


Название: Re: перемещение айтемов мышкой в QGraphicsView
Отправлено: kdm от Февраль 22, 2011, 13:20
определен метод void mouseMove(QMouseEvent*). Хотя как это может сказаться? ???
Удивительно, но после того как я закоментировал метов mouseMoveEvent и mousePressEvent все стало работать. Может баг Qt, я использую старый 2009.03.

Но оказалось все дело в том, что в переопределенном mouseMoveEvent надо вызывать mouseMoveEvent из базового класса QGraphicsView:
Код:
void MainWindowWidget :: mouseMoveEvent (QMouseEvent* event)
{
    ... do something
    QGraphicsView::mouseMoveEvent(event);
}


Название: Re: перемещение айтемов мышкой в QGraphicsView
Отправлено: GreatSnake от Февраль 22, 2011, 15:03
Цитировать
Но оказалось все дело в том, что в переопределенном mouseMoveEvent надо вызывать mouseMoveEvent из базового класса QGraphicsView:
Ну дык, конечно, без этого вызова до QGraphicsView не доходили нажатия.
Коли перегружаете методы базового класса надо всегда иметь в виду, что вы можете заломать функционал базового класса.