На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Перетаскивание карты мышью

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
Перетаскивание карты мышью, Пропажа изображения карты при перестакивании её
 
Здравствуйте.
Возникла проблема при реализации функциональности перетаскивании карты.
После нажатия и удерживания кнопки мыши изображения пропадает и возвращается только после отжатия кнопки.

Astra Linux, ГИС Конструктор для Qt Designer x64 версия 12. Qt4.
На ГИС Конструктор версии 11 изображение никуда не пропадало.

Код:
Код
MainWindow::MainWindow()
{
    viewMap = new QDMapView();

    //...
    // Остальной код
    //...

    connect(viewMap, SIGNAL(SignalMousePress(int,int,int)), this, SLOT(mapMousePress(int,int,int)));
    connect(viewMap, SIGNAL(SignalMouseRelease(int,int,int)), this, SLOT(mapMouseRelease(int,int,int)));
}


void MainWindow::mapMousePress(int x, int y, int mod)
{
    // Getting top left point from map
    int mapx,mapy;
    viewMap->GetMapLeftTop(&mapx,&mapy);

    // Getting reference point from widget
    QPoint pmap = viewMap->mapFromGlobal(QCursor::pos());

    setCursor(Qt::ClosedHandCursor);

    // Draging map
    mousePressed = true;
    while (mousePressed)
    {
        // Getting new point
        pmap = viewMap->mapFromGlobal(QCursor::pos());

        // Calculating offset
        int dx = pmap.x() - x;
        int dy = pmap.y() - y;

        // Offset for the point
        x = x + dx;
        y = y + dy;

        // Offset for the map
        mapx = mapx - dx;
        mapy = mapy - dy;

        // Setting new point for map
        viewMap->SetMapLeftTop(mapx,mapy);
    }

}
void MainWindow::mapMouseRelease(int x, int y, int mod)
{
    mousePressed = false;
    setCursor(Qt::ArrowCursor);
}
 
Здравствуйте!

Предлагаю несколько упростить исходный код слота обработки события нажатия клавиши мыши, чтобы не акцентировать внимание на пересчетах координат между виджетами:
Код
void MainWindow::mapMousePress(int x, int y, int mod)
{
  qDebug() << "mouse pressed";

  int left = 0;
  int top = 0;
  ui.DMapView1->GetMapLeftTop(&left, &top);

  ui.DMapView1->SetMapLeftTop(left + 100, top + 100);
}
В данном случае при каждом нажатии мыши происходит вызов слота - карта смещается на фиксированную величину и перерисовывается корректно.
 
Спасибо, но это не то что мне нужно, так как я пытаюсь реализовать перемещение карты с помощью зажатого курсора мыши.
То есть зажав кнопку мыши, переместив, скажем, на 100 пикселей вправо, я ожидаю что карта будет перемещаться вместе с курсором, а не от простого нажатия на карту.

Как я уже сказал ранее, в 11-ой версии Конструктора, моя реализация работала нормально и стала "глючить" при переходе на 12-ую версию.
Аналогичная предложенной вами реализация, уже давно написана и "повешена" на стрелки клавиатуры.
 
Здравствуйте!

Вы можете отслеживать перемещение мыши с помощью сигнала QDMapView::SignalMouseMove() и перерисовывать карту:
Код
connect(ui.DMapView1, SIGNAL(SignalMouseMove(int,int,int)), this, SLOT(onMouseMoved(int,int,int)));
Код
void MainForm1::onMouseMoved(int x, int y, int modkeys)
{
  qDebug() << "mouse moved";

  int left = 0;
  int top = 0;
  ui.DMapView1->GetMapLeftTop(&left, &top);

  ui.DMapView1->SetMapLeftTop(left + 10, top + 10);
}
 
По какой-то странной причине, это действительно помогло избавиться от исчезновения карты , хотя она и может мигать.
Просто  мне приходилось реализовать обработку колеса мыши и я думал реализовать  это в одной функции, а не разделять между сигналами карты и событиями  Qt
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности