2014-11-28 4 views
0

Наблюдая за исходным кодом Qt, я не вижу, где изменяется форма курсора при перемещении указателя мыши, в mouseMoveEvent ничего нет, ни enterEvent.Как в Qt обрабатываются форма курсора относительно позиции курсора?

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

+0

Позвольте мне убедиться, что я правильно понял. Вы хотите знать, как изменить форму курсора мыши в зависимости от положения мыши на виджете? – Iuliu

+0

Да, это мой конец, но я также хочу понять, как Qt делает это сам (чтобы не обрабатывать его в событии перемещения мыши) –

+0

Думаю, у меня есть решение для вас, см. Мой ответ. Скажите, соответствует ли мой пример вашим потребностям. – Iuliu

ответ

0

Вы можете реализовать mouseMoveEvent или install an event filter для своего виджета и для определенных положений мыши вы можете изменить курсор мыши с помощью API QCuror.

Вот пример:

CursorChange.pro:

QT  += core gui 

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

TARGET = CursorChange 
TEMPLATE = app 


SOURCES += main.cpp \ 
      widget.cpp 

HEADERS += widget.h 

widget.h:

#ifndef WIDGET_H 
#define WIDGET_H 

#include <QWidget> 

class Widget : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit Widget(QWidget *parent = 0); 
    ~Widget(); 

protected: 
    void mouseMoveEvent(QMouseEvent *event); 
}; 

#endif // WIDGET_H 

widget.cpp:

#include "widget.h" 

#include <QMouseEvent> 
#include <QCursor> 

Widget::Widget(QWidget *parent) : 
    QWidget(parent) 
{ 
    setMouseTracking(true); 
} 

Widget::~Widget() 
{ 
} 

void Widget::mouseMoveEvent(QMouseEvent *event) 
{ 
    if(event->pos().x() < geometry().width()/2) 
    { 
     setCursor(QCursor(Qt::OpenHandCursor)); 
    } 
    else 
    { 
     setCursor(QCursor(Qt::WaitCursor)); 
    } 

    QWidget::mouseMoveEvent(event); 
} 

main.cpp:

#include "widget.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    Widget w; 
    w.show(); 

    return a.exec(); 
} 

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

+0

«Но до этого я хочу понять, как это управляет Qt». <--- Это означает, что я не хотел решения, как это сделать (простой поиск в Google нашел бы аналогичный ответ) В источниках Qt я не видел никакого кода, как это, поэтому где это реализовано? –

+0

@ hl037_ Где реализовано что? Что вы искали в источниках Qt? Вы хотите понять, как Windows реализует такую ​​функцию? Что именно вы ищете? – Iuliu

+0

Осторожно, так как этот ответ будет распространять курсор на дочерние виджеты. –

Смежные вопросы