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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: определение положения курсора  (Прочитано 6624 раз)
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);
     }

но тогда элементы видны только если нажать на них и подвигать мышью, как при перетаскивании
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Декабрь 11, 2009, 20:28 »

Здравствуйте!
такой вопрос, я хочу чтобы какието элементы моего интерфейса были видны только в тот момент когда на них наведен указатель мыши, а в других случаях нет. подскажите как можно отслеживать положение курсора в виджете?
пробовал

setMouseTracking(true) установлен?
Записан
Lee Harvey Oswald
Гость
« Ответ #2 : Декабрь 11, 2009, 20:30 »

нет...

все прочитал про этот метод))) спс большое))
« Последнее редактирование: Декабрь 11, 2009, 20:34 от Lee Harvey Oswald » Записан
Lee Harvey Oswald
Гость
« Ответ #3 : Декабрь 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
подскажите как исправить))
« Последнее редактирование: Декабрь 11, 2009, 21:11 от Lee Harvey Oswald » Записан
Павел_F.
Гость
« Ответ #4 : Декабрь 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 и таскаться только по левой кнопке будет.

« Последнее редактирование: Декабрь 11, 2009, 21:33 от Павел_F. » Записан
spectre71
Гость
« Ответ #5 : Декабрь 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
Записан
Lee Harvey Oswald
Гость
« Ответ #6 : Декабрь 11, 2009, 22:20 »

Павел_F пробовал оба варианта, в первом случае ничего не меняется, окно так и скочит от курсора, а во втором случае не работает перетаскивание...

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

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

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

ps спасибо за оперативную помощ, отличный сайт! Улыбающийся
« Последнее редактирование: Декабрь 11, 2009, 22:23 от Lee Harvey Oswald » Записан
Павел_F.
Гость
« Ответ #7 : Декабрь 11, 2009, 23:30 »

mousePressEvent событие, которое возникает при нажатии кнопки мыши, mouseRaleaseEvent когда отпускают. Заметьте любой из кнопок.

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

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

А второй у меня работает. С координатами тоже также как у первого. Если вы его совсем не правили то там ошибка есть, я копировал из своего кода и название события поменять на ваше забыл. если дело не в этом то ищите у себя другие ошибки, код работает.
« Последнее редактирование: Декабрь 11, 2009, 23:50 от Павел_F. » Записан
Lee Harvey Oswald
Гость
« Ответ #8 : Декабрь 12, 2009, 01:39 »

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



уряяя)) сделал все как надо и заодно терь в событиях разобрался, покрайней мере мыши)))))  всем большое спс за помощ!
« Последнее редактирование: Декабрь 12, 2009, 02:54 от Lee Harvey Oswald » Записан
SASA
Гость
« Ответ #9 : Декабрь 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);
     }
По-моему, использовать магические константы плохо. Я бы сделал окошки прозрачными, и при наведении на них мышкой  делел бы их непрозрачными. При выходе мышки - опять прозрачными.
Записан
Lee Harvey Oswald
Гость
« Ответ #10 : Декабрь 16, 2009, 22:21 »

я в точности так и сдела))
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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