crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Смена курсора на виджете
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
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 30.9.2009, 14:36
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(Elfinit @ 30.9.2009, 10:32) *
С чем это может быть связано?

я думаю -- с координатами, надо проверить срабатывает условие или нет.

а чего if`ы у тебя такие ужасные?
что-то типа
bool QRect::contains ( const QPoint & point, bool proper = false ) const
не поможет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 30.9.2009, 16:36
Сообщение #3


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

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

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




Репутация:   44  


Цитата(Elfinit @ 30.9.2009, 10:32) *
С чем это может быть связано?

Может быть связано с тем, что QGraphicsView сам изменяет курсор в зависимости от объекта над которым находиться мышка. Это изменение, на сколько я помню, происходит в обработчике события mouseMoveEvent.
Где ты устанавливаешь свой курсор? Покажи код.

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


Участник
**

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

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




Репутация:   1  


Цитата(kwisp @ 30.9.2009, 15:36) *
Цитата(Elfinit @ 30.9.2009, 10:32) *
С чем это может быть связано?

я думаю -- с координатами, надо проверить срабатывает условие или нет.

а чего if`ы у тебя такие ужасные?
что-то типа
bool QRect::contains ( const QPoint & point, bool proper = false ) const
не поможет?


Проверял (выводил в консоль сообщение в каждом условии), всё нормально вроде с координатами.
А if'ы...Самому не нравятся, конечно) Но если пользоваться bool QRect::contains ( const QPoint & point, bool proper = false ) const, что надо же 9 прямоугольников где-то помнить (четыре стороны, четыре угла, содержимое), да ещё менять их при перемещении границ. А так - есть один areaRect, для которого и проверяю нахождение в целевой окрестности
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 30.9.2009, 21:42
Сообщение #5


Участник
**

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

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




Репутация:   1  


Цитата(BRE @ 30.9.2009, 17:36) *
Цитата(Elfinit @ 30.9.2009, 10:32) *
С чем это может быть связано?

Может быть связано с тем, что QGraphicsView сам изменяет курсор в зависимости от объекта над которым находиться мышка. Это изменение, на сколько я помню, происходит в обработчике события mouseMoveEvent.
Где ты устанавливаешь свой курсор? Покажи код.

Устанавливаю как раз в методе getCursorPosition (в конце каждого из условий вызывается setCursor). Для GraphicsView курсор я нигде не меняю вроде.
Кстати, для GrapicsPixmapItem'ов, которые вшаются на сцену, курсор срабатывает нормально. Например, режим просмотра большой фотки - при наведении на фотку курсор меняется на лупу, двойной клик приводит к увеличению. Или в режиме просмотра набора фоток, когда на сцене висит куча айтемов, курсор при наведении меняется на ладошку. А вот если на сцену вешать не GraphicsItem, а Widget, то курсор элегантно слетает.....

Сообщение отредактировал Elfinit - 30.9.2009, 21:59
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 30.9.2009, 21:53
Сообщение #6


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

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

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




Репутация:   5  


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


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

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

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




Репутация:   44  


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

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

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

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


Участник
**

Группа: Участник
Сообщений: 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
Сообщение #9


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

Группа: Участник
Сообщений: 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 меняет его на дефолтный.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 30.9.2009, 22:26
Сообщение #10


Участник
**

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

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




Репутация:   1  


Да, ещё, брешить на неверно вычисленные координаты тоже не стоит, т.к. "области интереса" (границы прямоугольника, углы) вычисляются точно верно, т.к. перетаскивание границ (за любую границу, за угол, перетаскивание выделенной области) нормально работает, правда вместо нужного курсора показывается ArrowCursor, что, естественно, неудобно жутко....

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

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

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

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

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


Т.е. при addWidget на самом деле на сцену вешается GraphicsItem? И вообще, зачем ему менять курсор на дефолтный? К тому же, как уже сказал, для GraphicsItem-ов, которые висят на сцене, курсор меняется без проблем при проведении мыши над ними....



Вот ещё что заметил....Если каким-то чудесным образом курсор всё-таки поменялся на актуальный (например, на SizeHor), то он не меняется вообще ни на какой до тех пор, пока курсор находится над виджетом.

Сообщение отредактировал Elfinit - 30.9.2009, 22:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.1.2021, 23:06