crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Смена курсора на виджете
Elfinit
  опции профиля:
сообщение 30.9.2009, 9:32
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


Доброе утро!
В общем, есть виджет PhotoFormatter, предназначенный для обрезки краёв фотографии. Может встраиваться в отдельный диалог, а может и в главное окно, в GraphicsView. При наведении курсора на края выделенной области он меняется, соответственно, на разные стрелки ресайза. А при наведении на выделенную область - на OpenHand, для перемещения выделенной области. Так вот, в случае диалога это срабатывает идеально, при работе в GraphicsView - курсор почти всегда не меняется. С чем это может быть связано?
Вот код функции определения вида курсора:
Раскрывающийся текст
PhotoFormatter::Enm_CursorPosition PhotoFormatter::getCursorPosition(const QPoint &pt)
{
    if (             pt.x() > areaRect.left()+3 &&
                         pt.y() > areaRect.top() + 3 &&
                         pt.x() < areaRect.right()-6 &&
                         pt.y() < areaRect.bottom()-6)
    {
        setCursor(Qt::OpenHandCursor);
        return PhotoFormatter::curpos_inRect;
    }
    if (          pt.y() > areaRect.top() + 2 &&
            pt.y() < areaRect.bottom() - 2 &&
            pt.x() > areaRect.left() - 2 &&
            pt.x() < areaRect.left() + 2)
    {
        setCursor(Qt::SizeHorCursor);
        return PhotoFormatter::curpos_leftBorder;
    }
    if (        pt.y() > areaRect.top() + 2 &&
            pt.y() < areaRect.bottom() - 2 &&
            pt.x() > areaRect.right() - 2 &&
            pt.x() < areaRect.right() + 2)
    {
        setCursor(Qt::SizeHorCursor);
        return PhotoFormatter::curpos_rightBorder;
    }
    if (        pt.x() > areaRect.left() + 2 &&
            pt.x() < areaRect.right() - 2 &&
            pt.y() > areaRect.top() - 2 &&
            pt.y() < areaRect.top() + 2)
    {
        setCursor(Qt::SizeVerCursor);
        return PhotoFormatter::curpos_topBorder;
    }
    if (        pt.x() > areaRect.left() + 2 &&
            pt.x() < areaRect.right() - 2 &&
            pt.y() > areaRect.bottom() - 2 &&
            pt.y() < areaRect.bottom() + 2)
    {
        setCursor(Qt::SizeVerCursor);
        return PhotoFormatter::curpos_bottomBorder;
    }
    if (        pt.x() > areaRect.left() - 2 &&
            pt.x() < areaRect.left() + 2 &&
            pt.y() > areaRect.top() - 2 &&
            pt.y() < areaRect.top() + 2)
    {
        setCursor(Qt::SizeFDiagCursor);
        return PhotoFormatter::curpos_leftTopCorner;
    }
    if (        pt.x() > areaRect.left() - 2 &&
            pt.x() < areaRect.left() + 2 &&
            pt.y() > areaRect.bottom() - 2 &&
            pt.y() < areaRect.bottom() + 2)
    {
        setCursor(Qt::SizeBDiagCursor);
        return PhotoFormatter::curpos_leftBottomCorner;
    }
    if (        pt.x() > areaRect.right() - 2 &&
            pt.x() < areaRect.right() + 2 &&
            pt.y() > areaRect.top() - 2 &&
            pt.y() < areaRect.top() + 2)
    {
        setCursor(Qt::SizeBDiagCursor);
        return PhotoFormatter::curpos_rightTopCorner;
    }
    if (        pt.x() > areaRect.right() - 2 &&
            pt.x() < areaRect.right() + 2 &&
            pt.y() > areaRect.bottom() - 2 &&
            pt.y() < areaRect.bottom() + 2)
    {
        setCursor(Qt::SizeFDiagCursor);
        return PhotoFormatter::curpos_rightBottomCorner;
    }
    setCursor(Qt::ArrowCursor);
    return PhotoFormatter::curpos_behind;    
}


Сообщение отредактировал Litkevich Yuriy - 1.10.2009, 6:06
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ufna
  опции профиля:
сообщение 30.9.2009, 21:53
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


Elfinit,
не подскажешь, каким методом метаданные из изображения вытаскиваешь? Имеешь ли дело с EXIF?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 30.9.2009, 22:11
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


Цитата(ufna @ 30.9.2009, 22:53) *
Elfinit,
не подскажешь, каким методом метаданные из изображения вытаскиваешь? Имеешь ли дело с EXIF?

Да, с ним самым. Библиотека называется exiv2 (http://www.exiv2.org). Под линуксом её даже собирать не надо, всего и делов - скачать пакет и прилинковаться к нему.
Инструкция по винде есть тут , сам когда-то ковырялся с этим...

Цитата(BRE @ 30.9.2009, 23:02) *
Цитата(Elfinit @ 30.9.2009, 22:42) *
Устанавливаю как раз в методе getCursorPosition (в конце каждого из условий вызывается setCursor). Для GraphicsView курсор я нигде не меняю вроде.

Откуда вызывается эта функция?

При перемещении мыши над QGraphicsView он постоянно проверяет над каким элементом сцены находиться мышка и устанавливает курсор на тот который задан в элементе. Возможно происходит следующее, ты меняешь курсор мыши, а следом QGraphicsView меняет его на дефолтный.


Вот код для маусМува виджета:
void PhotoFormatter::mouseMoveEvent(QMouseEvent *event)
{    
    event->accept();  
    if (event->buttons() & Qt::LeftButton) //зажата кнопка мыши - возможно, нужно перетаскивать границы...
    {
        switch (curPos)
        {
            case PhotoFormatter::curpos_inRect:process_inRect(event); break;
            case PhotoFormatter::curpos_behind:process_behind(event);break;
            case PhotoFormatter::curpos_bottomBorder:process_bottomBorder(event);break;
            case PhotoFormatter::curpos_leftBorder:process_leftBorder(event);break;
            case PhotoFormatter::curpos_leftBottomCorner:process_leftBottomCorner(event);break;
            case PhotoFormatter::curpos_leftTopCorner:process_leftTopCorner(event);break;
            case PhotoFormatter::curpos_rightBorder:process_rightBorder(event);break;
            case PhotoFormatter::curpos_rightBottomCorner:process_rightBottomCorner(event);break;
            case PhotoFormatter::curpos_rightTopCorner:process_rightTopCorner(event);break;
            case PhotoFormatter::curpos_topBorder:process_topBorder(event);break;
            case PhotoFormatter::curpos_undefined:process_undefined(event);break;
        }
    }
    else
    {
        getCursorPosition(event->pos());
    }

    actionPoint = event->pos();
    update();

    QLabel::mouseMoveEvent(event);
}


Повторюсь, если встаивать этот виджет в диалог, всё срабатывает идеально. А для GraphicsView mouseMove я вообще не переопределял, т.к. и не наследовал от него...

Сообщение отредактировал Elfinit - 30.9.2009, 22:13
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 30.9.2009, 22:20
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Elfinit @ 30.9.2009, 23:11) *
Повторюсь, если встаивать этот виджет в диалог, всё срабатывает идеально.

А диалоги не пытаются изменяют курсор в зависимости от положения мыши. :)

Цитата(Elfinit @ 30.9.2009, 23:11) *
А для GraphicsView mouseMove я вообще не переопределял, т.к. и не наследовал от него...

А зачем от него наследоваться?
Каждый виджет на сцене располагается в элементе сцены и ведет себя для QGraphicsView как элемент сцены.

Возможно (не точно/IMHO) дело в этом (тоже позволю себе повториться):
При перемещении мыши над QGraphicsView он постоянно проверяет над каким элементом сцены находиться мышка и устанавливает курсор на тот который задан в элементе. Возможно происходит следующее, ты меняешь курсор мыши, а следом QGraphicsView меняет его на дефолтный.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.4.2024, 20:05