Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Lee Harvey Oswald от Декабрь 11, 2009, 20:22



Название: определение положения курсора
Отправлено: Lee Harvey Oswald от Декабрь 11, 2009, 20:22
Здравствуйте!
такой вопрос, я хочу чтобы какието элементы моего интерфейса были видны только в тот момент когда на них наведен указатель мыши, а в других случаях нет. подскажите как можно отслеживать положение курсора в виджете?
пробовал
virtual void mouseMoveEvent(QMouseEvent* pe)
     {
         if(((pe->x() >=120) && (pe->x() <= 139)) && ((pe->y() >= 134) && (pe->y() <= 204)))
             volumeSlider->setVisible(true);
         else
             volumeSlider->setVisible(false);
         if(((pe->x() >=88) && (pe->x() <= 164)) && ((pe->y() >= 230) && (pe->y() <= 250)))
             seekSlider->setVisible(true);
         else
             seekSlider->setVisible(false);
     }

но тогда элементы видны только если нажать на них и подвигать мышью, как при перетаскивании


Название: Re: определение положения курсора
Отправлено: Alex Custov от Декабрь 11, 2009, 20:28
Здравствуйте!
такой вопрос, я хочу чтобы какието элементы моего интерфейса были видны только в тот момент когда на них наведен указатель мыши, а в других случаях нет. подскажите как можно отслеживать положение курсора в виджете?
пробовал

setMouseTracking(true) установлен?


Название: Re: определение положения курсора
Отправлено: Lee Harvey Oswald от Декабрь 11, 2009, 20:30
нет...

все прочитал про этот метод))) спс большое))


Название: Re: определение положения курсора
Отправлено: Lee Harvey Oswald от Декабрь 11, 2009, 20:52
теперь другая проблема))

перетаскивание окна у меня было сделано так

     virtual void mousePressEvent(QMouseEvent* pe)
     {
         m_ptPosition = pe->pos();
     }

     virtual void mouseMoveEvent(QMouseEvent* pe)
     {
         move(pe->globalPos() - m_ptPosition);
         ...

и теперь как только я попадаю на окно, оно тут же перемещается))  окно у меня  class MainWindow : public QLabel
подскажите как исправить))


Название: Re: определение положения курсора
Отправлено: Павел_F. от Декабрь 11, 2009, 21:26
Код:
bool moveEnable = false;
     virtual void mouseReleaseEvent(QMouseEvent* pe)
     {
         moveEnable = false;
     }

     virtual void mousePressEvent(QMouseEvent* pe)
     {
         m_ptPosition = pe->pos();
         moveEnable = true;
     }

     virtual void mouseMoveEvent(QMouseEvent* pe)
     {
         if( moveEnable) move(pe->globalPos() - m_ptPosition);
...
Должно заработать... Но таскаться по любой кнопке мыши. И у события accept нужно вызывать, ну или ignore чтобы стандартный обработчик тоже отработал нормально.
Или:
Код:
    virtual void mousePressEvent(QMouseEvent* pe)
     {
         if ( pe->button() == Qt::LeftButton){
         m_ptPosition = pe->pos();
         pe->accept();
         }
     }

     virtual void mouseMoveEvent(QMouseEvent* pe)
     {
         if (event->buttons() & Qt::LeftButton){
         move(pe->globalPos() - m_ptPosition);
         pe->accept();
         }
         ...
есть и accept и таскаться только по левой кнопке будет.



Название: Re: определение положения курсора
Отправлено: spectre71 от Декабрь 11, 2009, 21:27
теперь другая проблема))

перетаскивание окна у меня было сделано так

     virtual void mousePressEvent(QMouseEvent* pe)
     {
         m_ptPosition = pe->pos();
     }

     virtual void mouseMoveEvent(QMouseEvent* pe)
     {
         move(pe->globalPos() - m_ptPosition);
         ...

и теперь как только я попадаю на окно, оно тут же перемещается))  окно у меня  class MainWindow : public QLabel
подскажите как исправить))

Обрабатывай:
virtual void mouseReleaseEvent ( QMouseEvent * event


Название: Re: определение положения курсора
Отправлено: Lee Harvey Oswald от Декабрь 11, 2009, 22:20
Павел_F пробовал оба варианта, в первом случае ничего не меняется, окно так и скочит от курсора, а во втором случае не работает перетаскивание...

Цитировать
И у события accept нужно вызывать, ну или ignore чтобы стандартный обработчик тоже отработал нормально.
несовсем понял

есть конечно вариант что у меня просто ручки кривые, т.к. это первая моя програма на Qt и я пока что не оч разбираюсь, но вроде бы тут негде накосячить)

кстати подскажите плз что делает mouseReleaseEvent, в асистансе чего то непонятно написано

ps спасибо за оперативную помощ, отличный сайт! :)


Название: Re: определение положения курсора
Отправлено: Павел_F. от Декабрь 11, 2009, 23:30
mousePressEvent событие, которое возникает при нажатии кнопки мыши, mouseRaleaseEvent когда отпускают. Заметьте любой из кнопок.

Кроме вашего обработчика события есть еще стандартный, он тоже нужен. Конкретно в этой задаче можно и обойтись, но в принципе это может привести к нехорошим результатам. И лучше писать как реагировать на событие( accept, ignore).

Про первый вариант. если хотели перетаскивать плавно то координаты считаете не правильно.
Надо не
Код:
m_ptPosition = pe->pos();
а
Код:
m_ptPosition = pe->globalPos() - frameGeometry().topLeft();
Это потому, что move "двигает за левый верхний".
Вот как-то так, прыгать должен перестать. Не думал я сначала о правильности ваших расчетов. Да и какую именно кнопку нажали тоже смотреть нужно. Например, в этом коде, если зажать и левую и правую а потом тащить и отпустить одну из них то перетаскивание завершится, что не совсем правильно логически.

А второй у меня работает. С координатами тоже также как у первого. Если вы его совсем не правили то там ошибка есть, я копировал из своего кода и название события поменять на ваше забыл. если дело не в этом то ищите у себя другие ошибки, код работает.


Название: Re: определение положения курсора
Отправлено: Lee Harvey Oswald от Декабрь 12, 2009, 01:39
ну такую ошибку пропустить тяжело, да и нескомпилился бы код)
спс за совет, учту.
буду разбиратся что не так)))



уряяя)) сделал все как надо и заодно терь в событиях разобрался, покрайней мере мыши)))))  всем большое спс за помощ!


Название: Re: определение положения курсора
Отправлено: SASA от Декабрь 15, 2009, 11:18
virtual void mouseMoveEvent(QMouseEvent* pe)
     {
         if(((pe->x() >=120) && (pe->x() <= 139)) && ((pe->y() >= 134) && (pe->y() <= 204)))
             volumeSlider->setVisible(true);
         else
             volumeSlider->setVisible(false);
         if(((pe->x() >=88) && (pe->x() <= 164)) && ((pe->y() >= 230) && (pe->y() <= 250)))
             seekSlider->setVisible(true);
         else
             seekSlider->setVisible(false);
     }
По-моему, использовать магические константы плохо. Я бы сделал окошки прозрачными, и при наведении на них мышкой  делел бы их непрозрачными. При выходе мышки - опять прозрачными.


Название: Re: определение положения курсора
Отправлено: Lee Harvey Oswald от Декабрь 16, 2009, 22:21
я в точности так и сдела))