Russian Qt Forum
Июня 23, 2025, 12:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: перемещение айтемов мышкой в QGraphicsView  (Прочитано 6162 раз)
kdm
Гость
« : Января 29, 2011, 05:04 »

Подскажите, как правильно перемещать айтемы внутри QGraphicsView мышкой. Смотрел примеры Qt, но там много кода, выполняющего разные действия, где что не подсек. Какой правильный подход? Раньше таких задач еще не делал.
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #1 : Января 29, 2011, 09:49 »

Установи у них флаги выделения и перемещения.

    setFlag(QGraphicsItem::ItemIsMovable, true);
    setFlag(QGraphicsItem::ItemIsSelectable, true);
Записан
kdm
Гость
« Ответ #2 : Февраля 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);
« Последнее редактирование: Февраля 20, 2011, 20:00 от kdm » Записан
kdm
Гость
« Ответ #3 : Февраля 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);
}
« Последнее редактирование: Февраля 22, 2011, 14:01 от kdm » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Февраля 22, 2011, 15:03 »

Цитировать
Но оказалось все дело в том, что в переопределенном mouseMoveEvent надо вызывать mouseMoveEvent из базового класса QGraphicsView:
Ну дык, конечно, без этого вызова до QGraphicsView не доходили нажатия.
Коли перегружаете методы базового класса надо всегда иметь в виду, что вы можете заломать функционал базового класса.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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