Russian Qt Forum
Сентябрь 30, 2024, 14:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: подскажите как...  (Прочитано 7433 раз)
KontAr
Гость
« Ответ #15 : Декабрь 21, 2011, 17:05 »

что то не получается:
Код:
void GraphicsView::mouseMoveEvent(QMouseEvent *event)
{
    if(midButtonIsPressed)
    {
        QPointF p = mapToScene(event->pos()) - startPoint;
        centerOn(mapToScene(rect().center()) + p);

        startPoint = mapToScene(event->pos());
        return;
    }
}

уже нервов нехватает...
Записан
popper
Гость
« Ответ #16 : Декабрь 22, 2011, 09:59 »

Я ошибся сказав, что использовал centerOn.
Вот работающий код:
Код:
void GeoMapGraphicsView::mousePressEvent ( QMouseEvent * e )
{
    if (e->button() == Qt::RightButton){
        this->setCursor(Qt::ClosedHandCursor);
        isTouched = true;
        startMousePos = this->mapToScene(e->pos());
        e->accept();
    }
    else e->ignore();
}

void GeoMapGraphicsView::mouseReleaseEvent ( QMouseEvent * e )
{
    if (e->button() == Qt::RightButton && isTouched){
        setCursor(Qt::OpenHandCursor);
        isTouched = false;
        e->accept();
    }
    else e->ignore();
}

void GeoMapGraphicsView::mouseMoveEvent ( QMouseEvent * e )
{
    QPointF curMousePos = this->mapToScene(e->pos());
    if ((e->buttons() & Qt::RightButton) && isTouched)
        translate(curMousePos.x() - startMousePos.x(), curMousePos.y() - startMousePos.y());
    else
        QToolTip::showText(e->globalPos(),
                           QString("%1 %2").arg(curMousePos.x()).arg(90.0-curMousePos.y()),
                           this, QRect());
    e->accept();
}
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #17 : Декабрь 22, 2011, 11:57 »

Я ошибся сказав, что использовал centerOn.
Вот работающий код:
Некоторые поправки:
1. В mousePressEvent() вставить проверку:
Код
C++ (Qt)
if( verticalScrollBar()->isVisible() || horizontalScrollBar()->isVisible() ) ...
 
2. Зачем в mouseMoveEvent() использовать довольно-таки тяжелый translate(), когда можно просто двигать вьюпорт так:
Код
C++ (Qt)
horizontalScrollBar()->setValue( horizontalScrollBar()->value() + (...) );
verticalScrollBar()->setValue( verticalScrollBar()->value() + (...) );
3. Наверное в mousePressEvent() и mouseReleaseEvent() нужно не игнорировать событие, а вызывать соответствующий метод базового класса.
Записан

Qt 5.11/4.8.7 (X11/Win)
popper
Гость
« Ответ #18 : Декабрь 22, 2011, 15:40 »

1. Согласен, для задачи топикстартера это нужно.
2. Сравнивая перемещение вью с помощью реализованного метода мыши и с помощью скроллов, которые тоже перемещаю мышью, не заметил существенной разности. Тут нужно тестировать.
3. Согласен
Записан
KontAr
Гость
« Ответ #19 : Январь 10, 2012, 20:17 »

почему то translate не работает. может флаг какой поставить надо?
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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